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