0

我正在研究这个源代码,它演示了如何将 NSURLConnection 与 NSOperation 一起使用: link

我对在线代码感到困惑76

if (![NSThread isMainThread])
    {
        [self performSelectorOnMainThread:@selector(start)
                               withObject:nil waitUntilDone:NO];
        return;
    }

为什么作者要确保代码在主线程上运行?

NSOperation 的全部意义不是不在主线程和后台线程中运行以使其不会阻塞吗?

代码来自这篇解释它的文章,虽然它没有回答我的问题:http ://eng.pulse.me/concurrent-downloads-using-nsoperationqueues/

4

5 回答 5

1

NSURLConnection 文档中,您可以看到;

NSURLConnection 的委托方法——由 NSURLConnectionDelegate 协议协议定义——允许对象接收有关 URL 请求异步加载的信息回调。[...]这些委托方法在为关联的 NSURLConnection 对象启动异步加载操作的线程上调用。

在 NSURLConnection 上启动操作适用于任何线程,但是如果您想(例如)显示进度,则在 GUI/主线程上获取委托回调非常有用。

于 2013-01-13T21:42:03.603 回答
0

如果您使用 NSURLConnection 异步,则需要在主线程上启动此操作以获取回调。如果您从后台线程启动异步 NSURLConnection,如果您启动 NSURLConnection 的后台线程正忙于其他活动,您可能会丢失它的回调。

于 2013-04-15T13:43:24.473 回答
0

如果你在主线程中调用start方法,当前操作的main方法会在主线程中运行,但是你将当前操作推送到NSOperationQueue(不是主队列),在子线程中调用start方法,在子线程中调用当前操作的main方法。

子线程照片

子线程中的主要方法

于 2016-06-01T08:24:36.980 回答
-1

原因是,在 iOS 4.0+ 上,无论操作是否并发,操作都是在后台线程中运行的。由于在这种情况下操作是并发的,因此该方法立即存在并且线程被终止,因此没有调用委托方法(NSURLConnection 调用它开始的线程上的委托方法)。

唯一的选择是,要么启动一个 NSRunLoop(非常忙碌),要么使用一个已经有一个(主线程)的线程——这就是为什么 start 方法是从主线程运行的。

与许多建议的更新 UI 无关(尽管我理解这一点,但在队列中运行 NSURLConnection 的全部原因是在单独的线程中处理委托回调以避免阻塞 UI)。这不是作者的意图,它是 UIKit 安全的事实只是一个结果。

于 2013-01-14T02:54:52.987 回答
-1

如果这是一个示例,我相信将其放入其中是为了让您了解将代码放入与不放入之间的区别。如果此代码要同时执行并且应该让您的主线程保持活动状态,那么确实该代码部分不应该存在,但是它可能已经放在那里以便您删除并查看差异。不过你确实是对的。浏览文件的其余部分,如果你想让你的主线程保持打开状态,它看起来不应该在那里。

于 2013-01-13T21:37:52.370 回答