试图等待一组NSURLConnections完成

时间:2012-08-22 13:23:26

标签: ios nsurlconnection grand-central-dispatch

我有一堆服务器请求,我可以异步运行,但我需要等待它们全部完成才能继续。

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);
}

这导致它永远阻止,因为永远不会调用NSURLConnectionDelegateNSURLConnectionDataDelegate方法。我假设我以某种方式阻止了他们的线程,但是使用NSLog我可以确认NSURLConnection与我的cleanRoom方法不同。

我读了一些关于没有运行循环来进行回调的其他线程,所以我尝试了connection setDelegateQueue:[NSOperationQueue mainQueue]][[NSRunLoop currentRunLoop] runUntilDate:[NSDate distantFuture]]之类的东西,但没有明显的效果。

+ sendAsynchronousRequest:queue:completionHandler:对我不起作用,我有一些丑陋的身份验证。我已经看到了一些很好的例子,但我在调整方面失败了。

我显然遗漏了一些基本位,但我找不到它。

1 个答案:

答案 0 :(得分:2)

NSURLConnection需要在具有已处理的运行循环的线程上运行。最简单的这样的线程是主线程。因此dispatch_async dispatch_get_main_queue()这些连接创建dispatch_group和其他NSURLConnection逻辑应该没问题。请记住,委托方法将在主线程上调用(来自{{1}}概述):

  

在启动相关NSURLConnection对象的异步加载操作的线程上调用这些委托方法。