我有一堆服务器请求,我可以异步运行,但我需要等待它们全部完成才能继续。
dispatch_group_async似乎很合理,但我无法让它发挥作用。它要么永久阻止,要么根本不阻塞。我的最新尝试看起来像....
dispatch_group_t group;
- (void)cleanRoom {
NSAssert(![NSThread isMainThread], @"not on main thread.");
group = dispatch_group_create();
for (Junk *thing in myRoom) {
// take it off the current thread
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// register code against group
dispatch_group_enter(attachmentGroup);
NSURLConnectionWrapper *wrapper = [[NSURLConnectionWrapper alloc] init];
wrapper.delegate = self;
[wrapper sendRequestFor:thing];
}];
}
// wait till the stuff is the group is done
dispatch_group_wait(attachmentGroup, DISPATCH_TIME_FOREVER);
NSLog(@"waiting complete!!!!");
// process the results now that I have them all
}
- (void)wrapperConnectionDone {
// do a bit more junk
dispatch_group_leave(group);
}
这导致它永远阻止,因为永远不会调用NSURLConnectionDelegate
和NSURLConnectionDataDelegate
方法。我假设我以某种方式阻止了他们的线程,但是使用NSLog
我可以确认NSURLConnection
与我的cleanRoom
方法不同。
我读了一些关于没有运行循环来进行回调的其他线程,所以我尝试了connection setDelegateQueue:[NSOperationQueue mainQueue]]
和[[NSRunLoop currentRunLoop] runUntilDate:[NSDate distantFuture]]
之类的东西,但没有明显的效果。
+ sendAsynchronousRequest:queue:completionHandler:
对我不起作用,我有一些丑陋的身份验证。我已经看到了一些很好的例子,但我在调整方面失败了。
我显然遗漏了一些基本位,但我找不到它。
答案 0 :(得分:2)
NSURLConnection
需要在具有已处理的运行循环的线程上运行。最简单的这样的线程是主线程。因此dispatch_async
dispatch_get_main_queue()
这些连接创建dispatch_group
和其他NSURLConnection
逻辑应该没问题。请记住,委托方法将在主线程上调用(来自{{1}}概述):
在启动相关NSURLConnection对象的异步加载操作的线程上调用这些委托方法。