gpt4 book ai didi

ios - 如何以编程方式控制和平衡 iOS 应用程序正在执行的多个线程?

转载 作者:可可西里 更新时间:2023-11-01 05:13:59 24 4
gpt4 key购买 nike

如何控制和平衡我的应用正在执行的线程数,如何限制它们的数量以避免应用因为达到线程限制而阻塞?

在 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.
});
});
}];
});

这种设计通常会导致以下情况:

  1. 由于达到线程限制(例如> 64),应用被锁定
  2. 速度较慢且因此狭窄的队列可能会被大量待处理的作业淹没。
  3. 第二个也会产生取消问题 - 如果我们已经有 100 个作业在串行队列中等待执行,我们无法立即取消它们。

明显而愚蠢的解决方案是用 dispatch_sync 替换敏感的 dispatch_async 方法,但我绝对不喜欢它。

对于这种情况,推荐的方法是什么?

我希望确实存在比“使用 NSOperationQueue - 它可以限制并发操作的数量”更聪明的答案(类似主题:Number of threads with NSOperationQueueDefaultMaxConcurrentOperationCount)。

更新 1:看到唯一合适的模式:将所有 dispatch_async 的 block 替换为并发队列,并在基于 NSOperationQueue 的并发队列中运行这些包裹在 NSOperations 中的 block ,并设置了最大操作限制(在我的例子中可能还设置了最大对 AFNetworking 运行其所有操作的基于 NSOperationQueue 的队列的操作限制。

最佳答案

您启动的网络请求过多。据我所知,它没有在任何地方记录,但您最多可以同时运行 6 个网络连接(考虑到 RFC 2616 8.1.4 ,第 6 段,这是一个合理的数字)。之后你得到锁定,GCD 补偿创建更多线程,顺便说一句,have a stack space of 512KB each按需分配页面。所以是的,为此使用 NSOperation。我用它来排队网络请求,当再次请求同一个对象时增加优先级,如果用户离开则暂停并序列化到磁盘。我还以字节/时间为单位监控网络请求的速度,并更改并发操作的数量。

关于ios - 如何以编程方式控制和平衡 iOS 应用程序正在执行的多个线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14271892/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com