- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
根据关于 NSOperation 的 Apple 文档,我们必须覆盖 main
非并发操作的方法和start
并发操作的方法。但为什么?
最佳答案
首先,请记住,“并发”和“非并发”在 NSOperation
中有一些特殊的含义。这往往会使人们感到困惑(并且与“异步/同步”同义使用)。 “并发”是指“操作将管理自己的并发和状态”。 “非并发”是指“操作需要其他东西,通常是队列,来管理它的并发,并且需要默认状态处理。”start
执行所有默认状态处理。部分原因是它设置了isExecuting
,然后调用 main
当main
返回,它清除 isExecuting
并设置 isFinished
.由于您正在处理自己的状态,因此您不希望这样(您不想退出 main
来完成操作)。所以你需要实现自己的start
不要调用super
.现在,您仍然可以拥有 main
方法如果你想,但因为你已经覆盖了start
(这就是所谓的 main
),大多数人只是将所有代码放在 start
中.
作为一般规则,不要使用并发操作。他们很少是你的意思。它们绝对不是指“在后台运行的东西”。这两种操作都可以在后台运行(并且都不必在后台运行)。问题是您是否想要默认系统行为(非并发),或者您是否想要自己处理所有事情(并发)。
如果您自己处理它的想法是“启动 NSThread
”,那么您几乎肯定做错了(除非您这样做是为了与需要它的 C/C++ 库接口(interface))。如果它正在创建一个队列,那么您可能做错了(NSOperation 有各种功能可以避免这种情况)。如果它几乎是任何看起来像“在后台手动处理做事”的东西,那么你可能做错了。默认(非并发)行为几乎肯定比您将要做的更好。
在您使用的 API 已经为您处理并发的情况下,并发操作可能会有所帮助。非并发操作在 main
时结束返回。那么如果你的操作包装了一个像 NSURLConnection
这样的异步操作呢? ?一种处理方法是使用调度组,然后调用 dispatch_wait
在您的 main
末尾所以在一切完成之前它不会返回。没关系。我一直都这样做。但是它阻塞了一个不会被阻塞的线程,这会浪费一些资源,并且在一些复杂的极端情况下可能会导致死锁(真的很复杂。Apple声称这是可能的,他们已经看到了,但我从来没有能够让它发生,即使是故意的)。
因此,另一种方法是将自己定义为并发操作,并设置 isFinished
手动提交您的NSURLConnection
委托(delegate)方法。如果您包装其他异步接口(interface)(如 Dispatch I/O),也会发生类似情况,并且并发操作可能会更有效。
(理论上,当您想在不使用队列的情况下运行操作时,并发操作也很有用。我可以想象一些非常复杂的情况,这是有道理的,但这是一个延伸,如果你在那条船上,我假设你知道你在做什么。)
但是,如果您有任何疑问,只需使用默认的非并发行为即可。您几乎总是可以轻松地以这种方式获得您想要的行为(尤其是如果您使用调度组),然后您不必将大脑围绕在文档中对“并发”的有些困惑的解释上。
关于NSOperation,开始与主,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38546198/
是否可以将数据从 NSOperation 传递到下一个 NSOperation 使用的依赖链? 谢谢 克里斯 最佳答案 是的。当前NSOperation可以通过 dependencies 访问它的依赖
我有两个 NSOperation 负责下载和解析。下载操作成功后,我收到一些 NSData 我想将该数据设置为解析操作要使用的数据: init(context: NSManagedObjectCont
我的应用程序获取当前设备位置,将其发布到我的服务器,并返回要在 TableView 中显示的字典。目前我正在使用 CLLocationManager 委托(delegate)方法和 AFJSONReq
我正在编写一个网络连接的应用程序,它需要执行多个异步请求来加载依赖树中较低层所需的数据。 图 1. 出于可视化目的,考虑一个 ASIHTTPRequests A、B、C、D、E 和 F 的示例: A的
我有一个相当简单但昂贵的任务需要在后台运行,这是标准的 NSOperation 情况。我还需要确保该操作支持取消并适当停止。鉴于该要求,哪种方法更好:只是将昂贵的方法调用包装在 NSInvocatio
今天,我在尝试“概括”我的“CoreData 导入操作”时遇到了一个奇怪的问题。看来如果我创建 NSOperation 的通用子类 main() func 不会被调用。 简单的例子: class My
我需要帮助了解如何适当处理以下用例: 假设我正在编写一个聊天应用: 启动应用 请求服务器 (AFHTTPRequestOperation) 给我一个所有新消息的列表 遍历这些消息以查看我是否需要下载任
我想在当前执行的线程上同步执行一个 NSOperation。我可以只调用 [NSOperation start] 吗?这是否总是在当前正在执行的线程中运行? 另一种方法是创建一个 NSOperatio
我有一个应用程序,其中一个长时间运行的进程(> 1 分钟)被放置在 NSOperationQueue(队列 A)上。当队列 A 操作运行时,UI 完全响应,完全符合预期。 但是,我有一种用户可以执行的
我正在使用UIActivityItemProvider子类提供自定义数据。但是有时获取数据失败,并且我不想展示事件(例如消息编写器)。在[self cancel]方法中尝试了return nil;和i
根据关于 NSOperation 的 Apple 文档,我们必须覆盖 main非并发操作的方法和start并发操作的方法。但为什么? 最佳答案 首先,请记住,“并发”和“非并发”在 NSOperati
我正在开发一个 iPad 应用程序。它使用 NSOperation 在后台下载某些内容,并由 NSOperationQueue 处理。我发现,除非我向 NSOperation 添加保留,否则在执行操作
我将创建一系列 NSOperation 并在队列中运行它们。 它们都是按顺序运行的,一次运行一个。 这些操作将从网络获取数据并创建和保存核心数据管理对象。 如何处理应用程序退出的情况?由于操作在分离线
我在 NSOperation 和观察者方面遇到问题。 我有一个 tabbarcontroller 和一个 splashController。我希望启动画面加载并下载文件,并且在下载文件时使 tabba
我正在从 Facebook Connect 获取一些数据(使用 FBConnect Objective-C 2.0 框架),并且我在 NSOperation 中完成所有这些操作。它位于 NSOpera
我正在从NavigationController的 subview 中调用NSOperation。 MyOperation *op = [[MyOperation alloc] target:self
我是iPhone新手。在哪里可以找到NSOperationQueue和NSOperation的示例?NSOperationQueue和NSOperation与线程相比有什么优势? 谢谢 最佳答案 阅读
我对 NSOperations 有疑问。一切正常,但有时(我不知道为什么)操作 block 被简单地跳过。我错过了什么吗?操作怎么可能不是 NSLogging “输入操作”?以下是 viewDidLo
我一直在搜索,但只能找到委托(delegate)模式的想法来从 NSOperation 传回数据。我有一个 NSOperation 在完成该 NSOperation 后下载数据我希望它传递回将其下载的
我正在使用后台操作来发出 URL 请求。如果操作返回错误,如何通知我,然后将相同的操作类型重新添加到队列中以重试? 最佳答案 您可以使用 NSNotification 来实现这一点。创建通知并在请求失
我是一名优秀的程序员,十分优秀!