- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
是的,我知道。关于 NSOperation
世界有很多问题和答案,但我仍然有一些疑问。我会尝试用两部分的问题来解释我的疑虑。它们相互关联。
在 SO 帖子中 nsoperationqueue-and-concurrent-vs-non-concurrent , Darren 写道
A "concurrent" operation is concurrent on its own; it doesn't need NSOperationQueue to create a thread for it.
但是稍微搜索一下,我发现一个 NSOperation
,即使它被声明为并发(通过重写 isConcurrent
方法,例如它返回 YES
), 可以添加到 NSOperationQueue
。这是什么意思?如果我将一个并发的 NSOperation
添加到一个队列中,到底发生了什么?相反,如果我按原样使用并发操作(不将其添加到队列中)会发生什么情况?
Apple 文档中的注释很清楚:
...operation queues ignore the value returned by isConcurrent and always call the start method of your operation from a separate thread. ...In general, if you are always using operations with an operation queue, there is no reason to make them concurrent.
然后,我对在 NSOperation
中使用异步模式非常感兴趣。我找到了 Dave Dribin ( concurrent operations ) 的一个很好的教程。我明白了他帖子的整体意思。
您不能使用异步模式(例如使用异步 NSURLConnection
请求),因为无法调用委托(delegate)。当 main
完成时,操作被移除。解决方案是重写 start
方法来控制操作生命周期......处理运行循环可能会很痛苦。
现在,试图理解他的帖子,我怀疑是否需要在主线程中运行 start
方法。
- (void)start
{
if (![NSThread isMainThread])
{
[self performSelectorOnMainThread:@selector(start) withObject:nil waitUntilDone:NO];
return;
}
// other code here...
}
When dealing with asynchronous APIs, we can begin the asynchronous call on the main thread in start and keep the operation running until it finishes.
你能解释一下为什么吗?
提前谢谢你。
最佳答案
在我看来,NSOperation
的isConcurrent
属性的命名容易混淆。它的真正意思是“是异步的”。也就是说,当它的 -start
被调用时,它是否快速返回操作是否已经运行完成(异步)?还是直到操作运行完成(同步)才返回?
正如 Apple 的文档所述,当一个操作排队到 NSOperationQueue
时,这并不重要,因为无论如何队列都会在工作线程上调用它。如果它是同步的,那么该工作线程将专用于该操作,直到它完成。如果它是异步的,那么 -start
将在操作完成之前返回,工作线程可以继续做其他工作。
问题是,异步 -start
方法如何确保操作继续进行?这可能需要产生一个单独的线程来完成这项工作,但这是愚蠢的。最好让 NSOperationQueue
处理线程。
更有可能的是,它使用由外部事件驱动的运行循环源。 NSURLConnection
在其异步模式下就是这样的事情。但是,在那种情况下,它必须确保在其上安排运行循环源 a) 的线程将保留下来,并且 b) 将运行其运行循环。不能依赖 NSOperationQueue
的工作线程来完成这两个任务。
同样,您可以为每个这样的操作创建自己的线程,专门用于停留并运行其运行循环,但这是不必要的,而且,再一次,与让操作保持同步并将其排队相比,没有任何优势.
主线程是您已经知道会坚持并运行其运行循环的一个线程。因此,通常最好将运行循环源安排在主线程的运行循环上。唯一要注意的是,为了响应触发运行循环源的处理程序的外部事件,您不要在主线程上执行任何长时间运行的工作。因此,例如,当 NSURLConnection
使用接收到的数据调用您的委托(delegate)方法时,您不会对该数据进行昂贵的计算——或者,如果必须,将昂贵的计算移动到另一个线程。
另一种可能性(中间立场)是创建一个您自己的线程作为许多异步操作的 worker 。因此,不是使用主线程或每个操作一个线程,而是使用一个线程,其工作只是停在其运行循环中。您所有的异步操作都会在该线程的运行循环中自行安排。不过,这种方法并没有太大的必要性或优势。
关于objective-c - 揭秘 NSOperation : concurrent vs non-concurrent and async pattern,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10863157/
前言 Vue和Vite之父尤雨溪宣布成立公司 VoidZero,目前已经融资3200万。这篇文章欧阳将带你了解VoidZero是如何改变javascript的世界! 关注公众号:【前端欧阳】,给自
前言 TimerQueue 是.NET中实现定时任务的核心组件,它是一个定时任务的管理器,负责存储和调度定时任务。它被用于实现很多 .NET 中的定时任务,比如 System.Threadin
网站服务器这类问题我相信很多朋友讲过,但为什么他和网站优化还有关系呢?那么请您读读我写的没有文笔的文章,看看是否有所认同。 是的,服务器其实也是一个优化网站的最大杀手也是最大帮手,现今万网与阿里云
这个问题在这里已经有了答案: How does XPath deal with XML namespaces? (2 个回答) 5年前关闭。 我有这个 XML
在我们工作中无数次点击鼠标的时候,你有思考过鼠标是怎么工作的吗?在购买鼠标的时候你是怎么挑选的呢?看着那些标称的数据,你是否茫然过?那么如果小编现在说,其实每个鼠标都是一台优秀的“照相机”,你会相信
在浙江绍兴的山姆超市外,“黄牛”现象引发了广泛关注。这些“黄牛”通过提供带入和结账服务,让未办理会员卡的消费者也能进入超市购物。这一行为不仅扰乱了市场秩序,也对山姆会员商店的会员管理系统提出了挑战。今
在 this question海报询问如何在一行中执行以下操作: sub my_sub { my $ref_array = shift; my @array = @$ref_array
我正在尝试了解 Javascript Lambda 方法,但我仍然对非常灵活的定义方式和变量范围感到非常困惑。 例如我正在研究以下插件的代码,除了代码中还有其他部分我不太清楚,我感兴趣的是代码是如何组
谁能帮我揭开以下表达式的神秘面纱: ++[[]][+[]]+[+[]] 我的理解从左到右: ++[[]]:不确定这将评估什么以及如何评估。 [+[]]:+[] 将首先执行,一元运算符将尝试将 [] 转
在 python 中,可以在多个进程之间共享 ctypes 对象。但是我注意到分配这些对象似乎非常昂贵。 考虑以下代码: from multiprocessing import sharedctype
我目前对 Glassfish 3.1.2.2 处理 EJB 的方式感到困惑。 我有一个 OSGi 项目,它由许多 OSGi 包(jar)组成。此外,还有一些 WAR,包括 Tapestry Web 应
这些天我在玩线程库并尝试实现一些功能。其中一个教程说要运行程序使用: gcc -lpthread -lrt -lc -lm project1.c scheduler.c -o out 首先我需要深入了
如 app.secret_key未设置,Flask 将不允许您设置或访问 session 字典。 这就是flask user guide has to say在这个问题上。 我对 Web 开发很陌生,
Ruby on Rails 新手问题... 考虑以下代码(在 View 中): | | 在 ERB 标签中调用的一些方法对我来说就像魔法一样,我正试图揭开它们的神秘面纱。如果我不了解代码
HTTPS 是建立在 SSL/TLS 传输层安全协议之上的一种 HTTP 协议,相当于 HTTPS = HTTP + SSL/TLS。第一篇文章 “HTTPS - 通俗易懂的阐述 HTTPS 协
本周新 Xcode 3.2.1 中包含的自述文件内容如下: 静态代码分析通过“构建”菜单下的“构建和分析”选项或通过自定义build设置完全集成在 Xcode IDE 中 GCC 4.2 是 10.6
是的,我知道。关于 NSOperation 世界有很多问题和答案,但我仍然有一些疑问。我会尝试用两部分的问题来解释我的疑虑。它们相互关联。 在 SO 帖子中 nsoperationqueue-and-
运行后,我看到我的应用程序在 TaskMgr 中占用了 3.5Gb 我在 Windbg 中看到的内容有点令人困惑: 0:022> !address -summary ProcessParametrs
我是一名优秀的程序员,十分优秀!