Iphone NSO操作队列和处理应用程序出口

Iphone NSO操作队列和处理应用程序出口,iphone,multithreading,core-data,nsoperation,nsoperationqueue,Iphone,Multithreading,Core Data,Nsoperation,Nsoperationqueue,我将创建一系列NSOperations并在队列中运行它们 它们都是顺序的,一次运行一个 这些操作将从web获取数据,并创建和保存核心数据管理对象 如何处理应用程序退出的情况?由于操作在分离的线程中运行,如何使主线程等待当前操作“安全”退出?有些情况下,我很高兴线程(操作)在它们完成之前退出,因为在进一步的应用程序启动时,作业将继续,并从停止的地方开始 非常感谢, Mike如果你的应用程序在指定时间内无法自行退出,它将被迫退出。因此,等待一些数据从互联网上跌跌撞撞地传来可能不是一个好主意 但你已经

我将创建一系列
NSOperation
s并在队列中运行它们

它们都是顺序的,一次运行一个

这些操作将从web获取数据,并创建和保存核心数据管理对象

如何处理应用程序退出的情况?由于操作在分离的线程中运行,如何使主线程等待当前操作“安全”退出?有些情况下,我很高兴线程(操作)在它们完成之前退出,因为在进一步的应用程序启动时,作业将继续,并从停止的地方开始

非常感谢,


Mike

如果你的应用程序在指定时间内无法自行退出,它将被迫退出。因此,等待一些数据从互联网上跌跌撞撞地传来可能不是一个好主意


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

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


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

那么,如果我告诉操作队列取消应用程序上的所有操作,那么我如何让主线程等待直到取消的操作完成取消(即,当前操作线程已完成回滚和清理)?您不能。您可以尝试,但不能保证。如前所述,尽您所能使所有操作本质上原子化(原子写入是写入新文件时的一个选项,它首先在临时文件中写入内容,然后在完成后重命名该文件)当应用程序退出时,我不会回滚更改。而是在下一个应用程序启动时回滚。啊,WaitUntlAllOperations当然完成了!出于某种原因,我认为这只是初始化队列时调用的,而不是在执行过程中的任何时候!非常感谢:-)此答案有问题。无论你做什么,你的应用程序都会在短时间内退出,即使你阻止了主线程。applicationWillTerminate仅作为一个函数调用,系统不会等待很长时间,直到它完成后才关闭应用程序。无论如何,这可能仍然是一个好主意,只是当不是所有操作都在应用程序终止之前被终止时,不要感到惊讶。是的,我假设无论你在做什么,在应用程序终止之前,系统给你的退出时间都不会超过五秒钟: