1

我正在设计一个 iPhone 应用程序。我有一个非常紧张的过程要开始,在高层次上定义如下:

  1. 用户从 UITableView 中选择项目进行应用内购买。
  2. 用户在 UI 中确认购买。
  3. 异步过程转到 App Store 以检查项目之前是否已购买。如果没有,则购买该项目。然后通知 iPhone 应用程序购买项目成功。(如果它是之前购买的,则应用程序不关心并继续执行第 4 步。)
  4. 然后,该应用程序会转到我的私人服务器以下载所购买商品的数据。
  5. 然后应用程序将数据导入 CoreData。

当然,在流程的每一步,都会向用户报告错误,整个流程就会停止。

我有一个名为 activityIndi​​catorController 的类,它为用户提供了一个不错的 UIActivityIndi​​cator 以及一些指示正在发生的事情的文本。在流程的每一步,activityIndi​​cator 上的标签都必须更新为新状态。

问题/疑虑:

从设计和编码的角度来看,最简单的事情就是在所有步骤中使用一个大的 NSOperation。但是,我担心这可能会在以后妨碍我。我不想走错路,然后不得不撕下一堆代码。

我的直觉告诉我最好实现三个独立的 NSOperations(OpInAppPurchase、OpDownload、OpImport)。但是,每个后续操作不仅依赖于它之前的操作,而且如果一个操作失败,则根本不应该调用其余的 NSOperations。但是,我不确定如何设计/编码。

任何帮助表示赞赏。

编辑:

感谢大家到目前为止的帮助。对于我想要完成的事情,我不希望用户取消操作。但是,我确实希望该应用程序能够取消后续操作。我没有意识到并且只是通过反复试验(即“duh”时刻)发现的是,当一个操作在一个单独的进程中启动时,任何被启动的子操作也在同一个单独的进程中执行.

在阅读了下面链接的 Apple 文章后,我发现 NSInvocationOperation 完全满足我的需求,并且使我不必为每个进程创建单独的 NSOperation 对象。然后,如果失败,它将使用 NSError 对象对主线程进行回调,或者在成功时对主线程进行不同的回调。

也许我会有一些其他的进程,我确实希望用户将来能够取消,我会将 NSOperation 与其他事件一起使用。

4

2 回答 2

2

通过将每个步骤添加到一个中,NSOperationQueue您可以在继续之前检查以确保该步骤失败。有关一般方法,请参阅本文。

如果操作遇到问题,您还可以启动和响应来自 NSOperation 的取消请求。请参阅本文中的响应取消事件

响应取消事件:

操作开始执行后,它会继续执行其任务,直到完成或您的代码明确取消该操作。取消可以在任何时候发生,甚至在操作开始执行之前。尽管 NSOperation 类为客户端提供了一种取消操作的方法,但识别取消事件是自愿的。如果操作被彻底终止,则可能无法回收已分配的任何内存或资源。因此,操作对象应该检查取消事件,并在它们发生在操作中间时优雅地退出。

于 2010-11-27T15:34:27.027 回答
1

使用NSOperationQueue. 将每个任务封装在自己的NSOperation. 使用addDependency:.

“当一个操作失败时,如何防止其他操作被执行?”,你问。

好吧,首先,确保您的NSOperation对象是好公民,并定期检查它们是否已被取消,以便它们可以停止执行。

然后,只需通过每个操作dependencies来检查这些依赖关系是否被取消。如果是,也只需退出/取消当前操作。

于 2010-11-28T02:34:38.417 回答