并发执行和NSOperationQueue管理

时间:2016-10-21 20:34:51

标签: ios multithreading concurrency nsoperationqueue

我对iOS中的多线程有两个问题

  1. 如果我想模拟100个并发API调用,这意味着这100个API调用同时启动,我应该怎么做?
  2. 喜欢这样的事情

    for i in 0..<100 {
        //Start API call
    }
    

    或在一个operationQueue中添加100个操作并将max concurrent设置为100以上,启动队列中的操作

    所有这些应该意味着逐个启动API调用,那么如何同时启动它们呢?就像添加100个操作并一起开始一样

    1. 如何在operationQueue中添加和监控NSURLSessionDataTask对象?就像对多个NSURLSessioNDataTask对象使用waitUntilAllOperationsDone()方法一样。
    2. 我使用

      之类的东西
      dispatch_group_enter(group)
      session.dataTaskWithCompletion({
         dispatch_group_leave(group)
      })
      dispatch_group_notify()
      

      我想知道这是否可以在NSOperationQeue中实现,似乎NSURLSessionDataTask创建的每个线程都是由系统随机创建的,那么如何在NSOperationQueue中监控呢?

1 个答案:

答案 0 :(得分:0)

无论你是通过调用某个异步方法还是使用操作队列来启动这100个任务,效果都是类似的,它们在技术上都不会在同一时间开始,但它们应该(有一些警告) )彼此足够接近,以便假设异步API调用不会立即返回,你肯定会同时运行它们。

注意,如果API使用NSURLSession,您可能需要调整httpMaximumConnectionsPerHost的{​​{1}}。通常它会受到一些合理的限制,如果你想要100个并发任务(超过你想要在生产环境中使用的任务),你可能需要调整这个设置。

你问一些关于操作队列的问题。恕我直言,在此讨论中引入操作队列的好处很少。事实上,操作队列的主要用例之一是实现完全相反的,当你不希望它们全部并发运行时,而是想要将并发性限制在合理的范围内(例如每次4个)。因此,操作队列可能是最终生产解决方案的一部分,但不要仅仅为了尝试同时运行大量请求而引入它。

另请注意,尝试在操作队列上运行一堆异步任务时,您不能只NSURLSessionConfiguration或添加addOperationWithBlock。您必须创建一个NSBlockOperation的异步自定义子类,用于设置NSOperation标志并执行isAsynchronousisFinished所需的KVO。这并不难,但它的工作量足以让我在没有迫切需要的情况下引入它。

关于派遣小组&#34;通知&#34; vs操作队列,是的,您可以使用操作队列实现类似的操作。你可以创建一些&#34;完成&#34;操作依赖于所有其他操作完成,并在所有其他操作排队后将其添加到某个队列。