Ios 并发操作,为什么在主线程上启动?

Ios 并发操作,为什么在主线程上启动?,ios,objective-c,cocoa-touch,Ios,Objective C,Cocoa Touch,我正在研究此源代码,它演示了如何将NSURLConnection与NSOperation结合使用: 我对第76行的代码感到困惑 if (![NSThread isMainThread]) { [self performSelectorOnMainThread:@selector(start) withObject:nil waitUntilDone:NO]; return; } 为什

我正在研究此源代码,它演示了如何将NSURLConnection与NSOperation结合使用:

我对第76行的代码感到困惑

if (![NSThread isMainThread])
    {
        [self performSelectorOnMainThread:@selector(start)
                               withObject:nil waitUntilDone:NO];
        return;
    }
为什么作者要确保代码在主线程上运行

NSOperation的全部要点不是在主线程和后台线程上运行,这样它就不会阻塞吗


这段代码来自本文,虽然它没有回答我的问题:

如果这是一个示例,我相信这段代码放在那里是为了让您看到代码放在那里和不放在那里的区别。如果这段代码是并发执行的,并且应该让您的主线程保持活动状态,那么实际上,这段代码不应该在那里,但是它可能已经放在那里,以便您删除并查看差异。然而你确实是对的。浏览文件的其余部分,如果您想让主线程保持打开状态,则该文件似乎不应在其中。

从中,您可以看到

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


在NSURLConnection上启动操作可以在任何线程上运行,但是如果您想要(例如)显示进度,在GUI/主线程上获取代理回调非常有用。

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

唯一的选项是启动nsrunlop(非常繁忙)或使用已经有一个(主线程)的线程-因此,从主线程运行start方法


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

如果使用NSURLConnection asynchronous,则需要在主线程上启动此操作以获取回调。如果从后台线程启动异步NSURLConnection,则在启动NSURLConnection的后台线程忙于其他活动时,可能会丢失它。如果在主线程中调用start方法,则当前操作主方法将在主线程中运行,但您将当前操作推送到NSOperationQueue(非主队列),子线程中的启动方法调用,子线程中的当前操作主方法


仅凭这一段没有上下文的代码就有点难以猜测……不知道为什么。NSURLConnection将在后台线程上正常工作。@Paul.s有一个指向所有代码的链接:谢谢你的回答。我从这篇文章中获得了代码:当然。我想混淆的可能是它自己在调用start?这是哪里出现了混乱?很抱歉,这与用户界面无关(尽管我理解你的观点)。请检查我的答案(我经过一点研究后发现)。你能进一步阐述你的答案吗?这更像是一个评论。请阅读