objective-c - 并发和 NSURLConnection

标签 objective-c concurrency nsurlconnection

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

我在并发性和 NSURLConnection 中遇到的一个问题是未调用委托(delegate)方法。经过一些研究,我发现 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];
}

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

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

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

最佳答案

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

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

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

关于objective-c - 并发和 NSURLConnection,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7986364/

相关文章:

iOS 在后台显示本地通知弹出窗口

iphone - 参数和选择器

ios - UILabel - 多行

iphone - 在 Objective-C 中对 NSArray 进行排序的更好方法

java - 如何实现线程安全的收集器?

sql - 防止 SQL 事务中的竞争条件以确保数据完整性

iphone - 不调用 NSURLConnection 委托(delegate)方法

iphone - NSData initWithContentsOfURL : options: errorPtr: delegate object?

cocoa-touch - 在 iOS 应用中显示不受信任的证书信息

java - Java 对象锁定和监视器创建如何在 JVM 内部发生