是的,我知道。关于这个世界有很多问题和答案,NSOperation
但我仍然有一些疑问。我试图用一个两部分的问题来解释我的疑问。它们是相互关联的。
在 SO post nsoperationqueue-and-concurrent-vs-non-concurrent中,Darren写道
“并发”操作本身是并发的;它不需要 NSOperationQueue 为其创建线程。
但是稍微搜索了一下,我发现 a NSOperation
,即使它被声明为并发(通过覆盖isConcurrent
它返回的方法YES
),也可以添加到NSOperationQueue
. 这是什么意思?如果我将并发添加NSOperation
到队列中,幕后发生了什么?相反,如果我按原样使用并发操作(不将其添加到队列中)会发生什么?
从 Apple doc 中获取的注释很清楚:
...操作队列忽略 isConcurrent 返回的值,并始终从单独的线程调用操作的 start 方法。...一般来说,如果您总是在操作队列中使用操作,则没有理由使它们并发。
然后,我对在NSOperation
. 我找到了Dave Dribin的一个很好的教程(并发操作)。我明白了他帖子的整体含义。
您不能使用异步模式(例如使用异步NSURLConnection
请求),因为无法调用委托。当main
完成时,操作被删除。解决方案是重写start
控制操作生命周期的方法......并且处理运行循环可能会很痛苦。
现在,试图理解他的帖子,我怀疑是否需要start
在主线程中运行该方法。
- (void)start
{
if (![NSThread isMainThread])
{
[self performSelectorOnMainThread:@selector(start) withObject:nil waitUntilDone:NO];
return;
}
// other code here...
}
在处理异步 API 时,我们可以在 start 的主线程上开始异步调用,并保持操作运行直到完成。
你能解释一下为什么吗?
先感谢您。