我正在研究iPhone应用程序的设计。我有一个非常激烈的过程开始,定义如下:
当然,在流程的每一步中,都会向用户报告错误,整个过程都会停止。
我有一个名为activityIndicatorController的类,它为用户提供了一个漂亮的UIActivityIndicator以及一些指示正在发生的事情的文本。在流程的每个步骤中,必须使用新状态更新activityIndicator上的标签。
问题/关注:
从设计和编码的角度来看,EASIEST要做的就是在所有步骤中使用一个大的NSOperation。但是,我担心这可能会让我后来陷入困境。我不想走错路,然后不得不在以后撕掉一堆代码。
我的直觉告诉我,实施三个独立的NSOperations(OpInAppPurchase,OpDownload,OpImport)会更好。但是,每个后续操作不仅取决于它之前的操作,而且如果一个操作失败,则根本不应该调用其余的NSOperations。但是,我不确定如何设计/编码。
感谢任何帮助。
编辑:
感谢大家的帮助。对于我想要完成的任务,我不希望用户取消操作。但是,我希望该应用程序能够取消后续操作。我没有意识到并且只是通过反复试验(即“呃”时刻)才发现,当一个操作在一个单独的过程中被启动时,任何被启动的子操作也会在同一个单独的过程中执行
在阅读了下面链接的Apple文章之后,我发现根据我的需求,NSInvocationOperation正是我所需要的,并且使我不必为每个进程创建单独的NSOperation对象。然后它会在主线程失败时对主线程执行NSError对象的回调,或者在成功时对主线程进行不同的回调。
也许我会有一些其他的过程,我希望用户将来能够取消,我会将NSOperation与其他事件一起使用。
答案 0 :(得分:2)
将每个步骤添加到NSOperationQueue
中您可以检查以确保步骤失败后再继续。有关一般方法,请参阅此article。
如果操作遇到问题,您还可以启动并响应来自NSOperation的取消请求。请参阅此article中的响应取消事件。
回应取消事件:
操作开始执行后, 它继续执行任务,直到 它已完成或直到你的代码 明确取消操作。 取消可以随时进行, 甚至在手术开始之前 执行。虽然是NSOperation class为客户提供了一种方法 取消操作,认识到 取消活动是自愿的 必要性。如果是手术 彻底终止,可能没有 是一种回收任何记忆的方法 已分配的资源。如 结果,操作对象是 预计会检查取消 事件并在优雅时退出 它们发生在中间 操作
答案 1 :(得分:1)
使用NSOperationQueue
。将每个任务封装在自己的NSOperation
中。使用addDependency:
设置依赖项。
“当一个人失败时,如何防止其他操作被执行?”,你问。
首先,请确保您的NSOperation
个对象是好公民,并定期检查它们是否已被取消,以便他们可以停止执行。
然后,只需浏览每个操作的dependencies
以检查是否取消了这些依赖项。如果是,只要退出/取消当前操作。