我对iOS中的多线程有两个问题
喜欢这样的事情
for i in 0..<100 {
//Start API call
}
或在一个operationQueue中添加100个操作并将max concurrent设置为100以上,启动队列中的操作
所有这些应该意味着逐个启动API调用,那么如何同时启动它们呢?就像添加100个操作并一起开始一样
我使用
之类的东西dispatch_group_enter(group)
session.dataTaskWithCompletion({
dispatch_group_leave(group)
})
dispatch_group_notify()
我想知道这是否可以在NSOperationQeue中实现,似乎NSURLSessionDataTask创建的每个线程都是由系统随机创建的,那么如何在NSOperationQueue中监控呢?
答案 0 :(得分:0)
无论你是通过调用某个异步方法还是使用操作队列来启动这100个任务,效果都是类似的,它们在技术上都不会在同一时间开始,但它们应该(有一些警告) )彼此足够接近,以便假设异步API调用不会立即返回,你肯定会同时运行它们。
注意,如果API使用NSURLSession
,您可能需要调整httpMaximumConnectionsPerHost
的{{1}}。通常它会受到一些合理的限制,如果你想要100个并发任务(超过你想要在生产环境中使用的任务),你可能需要调整这个设置。
你问一些关于操作队列的问题。恕我直言,在此讨论中引入操作队列的好处很少。事实上,操作队列的主要用例之一是实现完全相反的,当你不希望它们全部并发运行时,而是想要将并发性限制在合理的范围内(例如每次4个)。因此,操作队列可能是最终生产解决方案的一部分,但不要仅仅为了尝试同时运行大量请求而引入它。
另请注意,尝试在操作队列上运行一堆异步任务时,您不能只NSURLSessionConfiguration
或添加addOperationWithBlock
。您必须创建一个NSBlockOperation
的异步自定义子类,用于设置NSOperation
标志并执行isAsynchronous
和isFinished
所需的KVO。这并不难,但它的工作量足以让我在没有迫切需要的情况下引入它。
关于派遣小组&#34;通知&#34; vs操作队列,是的,您可以使用操作队列实现类似的操作。你可以创建一些&#34;完成&#34;操作依赖于所有其他操作完成,并在所有其他操作排队后将其添加到某个队列。