我有一堆可以异步运行的服务器请求,但我需要等待它们全部完成才能继续。
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:
对我不起作用,我有一些丑陋的身份验证。我已经看到了一些很好的例子,但我未能适应。
我显然缺少一些基本的东西,但我找不到它。