3

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

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:对我不起作用,我有一些丑陋的身份验证。我已经看到了一些很好的例子,但我未能适应。

我显然缺少一些基本的东西,但我找不到它。

4

1 回答 1

2

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

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

于 2012-08-22T13:52:04.243 回答