RESTful iOS应用程序 - 何时更新模型 - 最佳实践

时间:2013-01-28 23:25:57

标签: iphone ios api model-view-controller rest

让我们来看一个典型的RESTful iOS应用程序,比如一个联系人应用程序,主屏幕是联系人列表,当你点击联系人时会看到联系人详细信息屏幕。

联系人列表是通过REST API获得的,联系人详细信息是通过另一个API获得的。

您将使用哪个事件来触发对这些API的调用:

  • 两个视图控制器上的viewDidAppear
  • 两个视图控制器上的viewWillAppear
  • 在主视图控制器中,在调用pushViewController之前调用contact detail API:detailViewController
  • 还有其他活动吗?

目前我正在使用viewWillAppear主要用于这种情况,或者在某些特定情况下使用viewDidAppear,但为了使我的编码实践标准化,我想明确地解决这些不同方法的优点/缺点。

3 个答案:

答案 0 :(得分:3)

部分原因是偏好。由于API调用将生成未知延迟,因此应用程序应显示指示其忙碌的UI。我的偏好是在请求之前让UI尽可能多地做。 (我天真的认知模型是,在获取数据时,查看新VC的UI会立即占用用户的思维,使得滞后时间显得更短)。

所以我赞成描述请求的VC的参数 - 比如要在详细VC上获取的联系人的id,并在viewDidAppear上执行请求(如果数据尚未缓存或需要刷新)。在该方法中,设置一些UI来指示正在进行提取,因此它具有以下形式:

- (void)viewDidAppear:(BOOL)animated {

    [super viewDidAppear:animated];

    if (/* i don't have my model or it's out of date */) {
        // put up 'i am busy' UI
        MyRequestClass *request = // form a request that fetches my model
        [request runWithBlock:^(id result, NSError *error) {
            // i build my request classes to run with blocks simplifying the caller side
            // if it's a json request, then pass a parsed result back to this block
            // remove 'i am busy' UI
            if (!error) {
                // init my model from result
                // other parts of this class observe that the model changes and updates the UI
            } else {
                // present error UI
            }
        }];
    }
}

答案 1 :(得分:1)

首先,确保您的API接口和数据访问在单独的数据访问类(或数据控制器中)视图控制器之外发生是一种很好的做法 - 如果您已经这样做,那么道歉,并忽略此段落。您希望避免将网络代码直接放入您的视图控制器中,因为如果您要创建特定于iPad的视图或者需要稍后以某种方式修改UI,这将使您的生活变得非常困难下线。

有了这个,你有几个选择。就用户方面的性能而言,最好尽可能从RESTful API中预取。这就是将您的API映射到Core Data的AFIncrementalStore等库。但是,如果你有成千上万的联系人,速度受限或带宽受限,这将是有问题的。

绝对可以肯定的是,您希望尽快调用您的网络API ,以便用户体验到最小的延迟。在这种情况下,您可能会发现使用viewDidLoad而不是viewWillAppearviewDidAppear可能效果更好:您可以使用加载/保留图形或动画设置视图,触发异步网络通话,然后一旦完成显示所需的信息。

答案 2 :(得分:0)

我通常这样做:

在viewWillAppear上加载联系人,如果有拉动刷新,则会发生这种情况。

当用户点击单元格时,在处理该事件的方法中,加载事件详细信息,并将该对象传递给联系人详细信息控制器的构造函数,然后将其推送。