【问题标题】:Concurrency and NSURLConnection并发和 NSURLConnection
【发布时间】:2011-11-02 19:41:17
【问题描述】:

最近我一直在研究和使用NSURLConnection 和并发。 似乎有几种不同的方法,而我尝试过的方法(调度队列和操作队列)最终似乎都能正常工作。

我在并发和NSURLConnection 中遇到的一个问题是没有调用委托方法。经过一番研究,我发现NSURLConnection 需要安排在主运行循环中,或者NSOperation 应该在主线程上运行。在第一种情况下,我像这样调用NSURLConnection

connection = [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:NO];
[connection scheduleInRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];
[connection start];

在后一种情况下是这样的:

- (void)start
{
    if (![NSThread isMainThread])
    {
        [self performSelectorOnMainThread:@selector(start) withObject:nil waitUntilDone:NO];
        return;
    }
    connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
}

委托方法处理其他所有事情,并且似乎都可以正常工作。 在我使用调度队列的情况下,我做了与第一种情况相同的事情(在主运行循环中安排NSURLConnection)。

我的问题是,这两种方法有什么区别?还是它们实际上是相同的,只是实现方式不同?

第二个问题是,为什么这是必要的?我还在NSOperation 中使用了NSXMLParser,这似乎不需要主运行循环或主线程,它就可以工作。

【问题讨论】:

    标签: objective-c concurrency nsurlconnection


    【解决方案1】:

    我想我自己想通了。因为NSURLConnectionNSXMLParser 都是异步的,所以当它们在后台运行时,它们需要一个运行循环来处理委托消息。 据我现在所知,主线程自动保持运行循环运行;主运行循环。因此,我发布的NSURLConnection 的两种解决方案都将确保主运行循环用于异步部分,方法是告诉连接将主运行循环用于委托消息,或者将整个操作移至主线程,这也会自动安排主线程上的连接。

    我现在想出的是在我的自定义 NSOperation 类上保持运行循环,因此我不再需要执行任何调度或线程检查。我在(void)start 方法的末尾实现了以下内容:

    // Keep running the run loop until all asynchronous operations are completed
    while (![self isFinished]) {
        [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];
    }
    

    【讨论】:

    • 非常感谢!你先生真棒!
    • 不客气 :) 顺便说一句,目前我建议改用AFNetworking,我认为它比NSURLConnection 等更容易使用。
    猜你喜欢
    • 1970-01-01
    • 2014-02-14
    • 2013-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多