gpb*_*pbl 6 grand-central-dispatch ios swift ios8
我只需要在请求多个 HTTP 资源来收集一些数据后运行一些代码。
\n\n我读了很多文档,发现我应该使用 GCD 和调度组:
\n\ndispatch_group_create()dispatch_group_enter()dispatch_group_leave()dispatch_group_wait()dispatch_release() 但我不确定这种做法是否会存在一些陷阱 \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) }\nRun Code Online (Sandbox Code Playgroud)\n
是的,这是基本思想,尽管您理想情况下会使用dispatch_group_notifywhile 来dispatch_group_wait阻塞dispatch_group_wait调用线程直到组完成,而dispatch_group_notify会在组完成时调用一个块,而不会在此期间阻塞调用线程。