大佬教程收集整理的这篇文章主要介绍了如何以编程方式控制和平衡iOS应用程序正在执行的多个线程?,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
在SO上我看到了以下可能的答案:“主并发队列(dispatch_get_global_queuE)自动管理线程数”,由于以下原因,我不喜欢这样做:
考虑以下模式(在我的真实应用程序中,有更简单和更复杂的示例):
dispatch_queue_t defaultBACkgroundQueue() { return dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0); } dispatch_queue_t databaseQueue() { dispatch_queue_create("Database private queue",0); } dispatch_async(defaultBACkgroundQueue(),^{ [AFNetworkingAsynchronousrequestWithCompletionHandler:^(data){ dispatch_async(databaseQueue(),^{ // data is about 100-200 elements to parse for (el in data) { } maybe more AFNetworking requests and/or processing in other queues or dispatch_async(dispatch_get_main_queue(),^{ // At last! We can do something on UI. }); }); }]; });
这种设计经常导致以下情况:
>由于达到了线程限制,应用程序被锁定(类似于> 64)
>较慢且因此较窄的队列可能会被大量待处理作业所淹没.
>第二个也会产生取消问题 – 如果我们有100个作业已经等待在串行队列中执行,我们就无法立即取消它们.
明显而愚蠢的解决方案是用dispatch_sync替换敏感的dispatch_async方法,但绝对是我不喜欢的方法.
这种情况的推荐方法是什么?
我希望答案比“使用NSOperationQueue – 它可以限制并发操作的数量”更加智能(类似主题:Number of threads with NSOperationQueueDefaultMaxConcurrentOperationCount).
更新1:唯一合适的模式是:将所有dispatch_async的块替换为并发队列,并在NSOperationQueue基于NSOperationQueue的并发队列中运行这些块,并设置最大操作限制(在我的情况下,也可能设置最大操作限制) AFNetworking运行其所有操作的基于NSOperationQueue的队列.
以上是大佬教程为你收集整理的如何以编程方式控制和平衡iOS应用程序正在执行的多个线程?全部内容,希望文章能够帮你解决如何以编程方式控制和平衡iOS应用程序正在执行的多个线程?所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。