【问题标题】:Queue of NSOperations and handling application exitNSOperations 队列和处理应用程序退出
【发布时间】:2010-12-06 16:16:21
【问题描述】:

我即将创建一系列NSOperations 并在队列中运行它们。

它们都是连续的,一次运行一个。

这些操作将从网络获取数据并创建和保存核心数据托管对象。

我该如何处理应用程序退出的情况?由于操作在分离线程中运行,我怎样才能让主线程等到当前操作“安全”退出?在某些情况下,我很高兴线程(操作)在它们完成之前退出,因为在进一步的应用程序启动时,作业将继续并从中断的地方继续。

非常感谢,

迈克

【问题讨论】:

    标签: iphone multithreading core-data nsoperation nsoperationqueue


    【解决方案1】:

    设计您的操作,以便他们在适当的安全时间检查其isCancelled 属性(在开始时、操作的一个阶段完成后等)并在该时间点退出。在applicationWillTerminate 中,向您的操作队列发送-cancelAllOperations 消息,然后发送-waitUntilAllOperationsAreFinished 消息。这将阻塞,直到队列中的所有操作都完成。如果所有操作都正确处理isCancelled,这应该不会减慢您的应用程序退出速度。

    需要注意的一点是,当从applicationWillTerminate 调用-waitUntilAllOperationsAreFinished 时,将阻塞主线程。如果您的任何操作在主线程上执行选择器,您的应用程序将在此时冻结。

    【讨论】:

    • 啊,当然是waitUntilAllOperationsAreFinished!出于某种原因,我认为这只是您在初始化队列时调用的东西,而不是在执行期间的任何时候!非常感谢:-)
    • 这个答案有问题。无论你做什么,你的应用都会在短时间内退出,即使你阻塞了主线程。 applicationWillTerminate 仅作为一种善意调用,系统在关闭应用程序之前不会等待很长时间。无论如何,这样做可能仍然是一个好主意,只是在应用程序终止之前并非所有操作都被杀死时不要感到惊讶。
    • 是的,我假设无论您在做什么,系统在杀死您的应用程序之前给您的退出时间不会超过 5 秒:developer.apple.com/iPhone/library/documentation/iPhone/…
    【解决方案2】:

    如果您的应用在指定时间内没有自行退出,它将被强制退出。因此,等待一些数据从互联网上跌跌撞撞地进来可能不是一个好主意。

    但你已经给自己答案了。只需通过设计使操作原子化。我的意思是你的操作要么完成工作(下载+保存数据),要么在下次启动时再次运行。如果应用程序在作业完成之前退出,请确保该作业的所有临时数据都已回滚。

    【讨论】:

    • 所以,如果我告诉操作队列取消对 applicationWillTerminate 的所有操作,我怎样才能让主线程等到取消的操作完成取消(即当前操作线程完成回滚所有操作并且清理)?
    • 你不能你可以试试,但不能保证。如前所述,尽你所能,使所有操作本质上是原子的(原子写入是写出新文件时的一种选择,它首先在临时文件中写出内容,然后在完成后重命名)
    • 应用程序退出时我不会回滚更改。而是在下次应用程序启动时回滚。
    猜你喜欢
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-04
    • 1970-01-01
    相关资源
    最近更新 更多