让多个NSURLConnections并行运行的问题

时间:2011-06-05 03:28:17

标签: objective-c cocoa-touch ios4 nsurlconnection nsurlrequest

我正在尝试让多个NSURLConnections并行运行(同步),但是如果它没有在主线程上运行(下面注释掉的代码块),则URL连接似乎根本不起作用(无) NSURLConnection委托方法被触发)。这是我的代码(NSOperation子类的实现文件):

- (void)start
{
    NSLog(@"DataRetriever.m start");
    if ([self.DRDelegate respondsToSelector:@selector(dataRetrieverBeganExecuting:)])
        [self.DRDelegate dataRetrieverBeganExecuting:identifier];

    if ([self isCancelled]) {
        [self finish];
    } else {

        /*
        //If this block is not commented out NSURLConnection works, but not otherwise
        if (![NSThread isMainThread])
        {
            [self performSelectorOnMainThread:@selector(start) withObject:nil waitUntilDone:NO];
            return;
        }*/

        SJLog(@"operation for <%@> started.", _url);

        [self willChangeValueForKey:@"isExecuting"];
        _isExecuting = YES;
        [self didChangeValueForKey:@"isExecuting"];

        NSURLRequest * request = [NSURLRequest requestWithURL:_url];
        _connection = [[NSURLConnection alloc] initWithRequest:request
                                                      delegate:self];
        if (_connection == nil)
            [self finish];
    } //not cancelled


}//start

使用调试器完成它,并且在此start方法结束后,没有NSURLConnection委托触发器(我在那里设置断点)。但在主线程上,它的工作正常。什么事情的想法?谢谢!

2 个答案:

答案 0 :(得分:3)

后台线程不会自动拥有active run loop。您需要在创建NSURLConnection后启动运行循环,以便从中获取任何输入。幸运的是,这很简单:

[[NSRunLoop currentRunLoop] run];

当您说您正在同步运行连接时,您是不正确的。 NSURLConnection的默认模式是异步的 - 它为您创建和管理新的后台线程,并在原始线程上回调委托。因此,您无需担心阻塞主线程。

如果您确实想要执行同步连接,则可以使用sendSynchronousRequest:returningResponse:error:,它将直接返回数据。有关详细信息,请参阅"Downloading Data Synchronously"

答案 1 :(得分:1)

NSURLConnection需要一个有效的运行循环来实际工作;确保这一点的最简单方法是从主线程运行它。

请注意,NSURLConnection通常是异步运行的(如果你同步运行一个,它真正做的是在另一个线程上异步运行一个然后阻塞直到完成),所以除了你在委托方法中做的任何处理之外它应该'对UI响应性有很大影响。