Sta*_*ich 4 concurrency objective-c 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.
});
});
}];
});
Run Code Online (Sandbox Code Playgroud)
这种设计经常导致以下情况:
明显而愚蠢的解决方案是用dispatch_sync替换敏感的dispatch_async方法,但绝对是我不喜欢的方法.
这种情况的推荐方法是什么?
我希望答案比"使用NSOperationQueue - 它可以限制并发操作的数量"更加智能(类似主题:具有NSOperationQueueDefaultMaxConcurrentOperationCount的线程数).
更新1:唯一可行的模式是:将所有dispatch_async的块替换为并发队列,并在NSOperationQueue基于NSOperationQueue的并发队列中运行这些块,并设置最大操作限制(在我的情况下,也可能设置最大操作限制) AFNetworking运行其所有操作的基于NSOperationQueue的队列.
您正在启动太多网络请求.AFAIK没有在任何地方记录,但您可以同时运行6个网络连接(考虑到RFC 2616 8.1.4,第6段,这是一个合理的数字).之后你会得到锁定,而GCD会补偿创建更多的线程,顺便说一下,每个线程的堆栈空间为512KB,并且按需分配页面.所以是的,请使用NSOperation.我用它来排队网络请求,在再次请求同一个对象时增加优先级,如果用户离开则暂停并序列化到磁盘.我还以字节/时间监视网络请求的速度并更改并发操作的数量.
| 归档时间: |
|
| 查看次数: |
1540 次 |
| 最近记录: |