最近我一直在研究和使用 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
,这似乎不需要主运行循环或主线程,它就可以正常工作。
最佳答案
我想我自己弄明白了。由于 NSURLConnection
和 NSXMLParser
都是异步的,因此当它们在后台运行时,它们需要一个用于委托(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/