在iPhone上设计和启动冗长,依赖异步过程的最佳方法是什么?

时间:2010-11-27 15:12:50

标签: iphone asynchronous nsoperation nsoperationqueue

我正在研究iPhone应用程序的设计。我有一个非常激烈的过程开始,定义如下:

  1. 用户从UITableView中为inApp选择项目 购买。
  2. 用户在UI中确认购买。
  3. 异步进程进入App Store查看是否有项目 之前已经购买过。如果不, 该项目已购买。 iPhone 然后app通知该项目 购买成功。 (如果它是 之前购买的应用程序 不关心,然后进入第4步。)
  4. 然后该应用程序将转到我的私人服务器下载所购商品的数据。
  5. 然后,应用程序将数据导入CoreData。
  6. 当然,在流程的每一步中,都会向用户报告错误,整个过程都会停止。

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

    问题/关注:

    从设计和编码的角度来看,EASIEST要做的就是在所有步骤中使用一个大的NSOperation。但是,我担心这可能会让我后来陷入困境。我不想走错路,然后不得不在以后撕掉一堆代码。

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

    感谢任何帮助。

    编辑:

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

    在阅读了下面链接的Apple文章之后,我发现根据我的需求,NSInvocationOperation正是我所需要的,并且使我不必为每个进程创建单独的NSOperation对象。然后它会在主线程失败时对主线程执行NSError对象的回调,或者在成功时对主线程进行不同的回调。

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

2 个答案:

答案 0 :(得分:2)

将每个步骤添加到NSOperationQueue中您可以检查以确保步骤失败后再继续。有关一般方法,请参阅此article

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

回应取消事件:

  

操作开始执行后,   它继续执行任务,直到   它已完成或直到你的代码   明确取消操作。   取消可以随时进行,   甚至在手术开始之前   执行。虽然是NSOperation   class为客户提供了一种方法   取消操作,认识到   取消活动是自愿的   必要性。如果是手术   彻底终止,可能没有   是一种回收任何记忆的方法   已分配的资源。如   结果,操作对象是   预计会检查取消   事件并在优雅时退出   它们发生在中间   操作

答案 1 :(得分:1)

使用NSOperationQueue。将每个任务封装在自己的NSOperation中。使用addDependency:设置依赖项。

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

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

然后,只需浏览每个操作的dependencies以检查是否取消了这些依赖项。如果是,只要退出/取消当前操作。