如何知道 iOS 中并行 HTTP 请求何时完成?

gpb*_*pbl 6 grand-central-dispatch ios swift ios8

我只需要在请求多个 HTTP 资源来收集一些数据后运行一些代码。

\n\n

我读了很多文档,发现我应该使用 GCD 和调度组

\n\n
    \n
  1. 创建一个群组dispatch_group_create()
  2. \n
  3. 对于每个请求:\n
      \n
    • 输入调度组dispatch_group_enter()
    • \n
    • 运行请求
    • \n
    • 收到回复后,离开小组dispatch_group_leave()
    • \n
  4. \n
  5. 等待与dispatch_group_wait()
  6. \n
  7. 释放该组dispatch_release()
  8. \n
\n\n

但我不确定这种做法是否会存在一些陷阱 \xe2\x80\x93 或者是否有更好的方法来等待并行请求完成?

\n\n

下面的代码看起来运行良好:

\n\n
    // Just send a request and call the when finished closure\n    func sendRequest(url: String, whenFinished: () -> Void) {\n        let request = NSMutableURLRequest(URL: NSURL(string: url))\n        let task  = NSURLSession.sharedSession().dataTaskWithRequest(request, completionHandler: {\n            (data, response, error) -> Void in\n            whenFinished()\n        })\n        task.resume()\n    }\n\n    let urls = ["http://example.com?a",\n        "http://example.com?b",\n        "http://example.com?c",\n        "http://example.com?d",\n        "http://invalid.example.com"]\n\n    var fulfilledUrls: Array<String> = []\n\n    let group = dispatch_group_create();\n\n    for url in urls {\n        dispatch_group_enter(group)\n\n        sendRequest(url, {\n            () in\n            fulfilledUrls.append(url)\n            dispatch_group_leave(group)\n        })\n\n    }\n\n    dispatch_group_wait(group, DISPATCH_TIME_FOREVER);\n\n    for url in fulfilledUrls { println(url) }\n
Run Code Online (Sandbox Code Playgroud)\n

ipm*_*mcc 5

是的,这是基本思想,尽管您理想情况下会使用dispatch_group_notifywhile 来dispatch_group_wait阻塞dispatch_group_wait调用线程直到组完成,而dispatch_group_notify会在组完成时调用一个块,而不会在此期间阻塞调用线程。