6

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

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

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

  • 两个视图控制器上的 viewDidAppear
  • viewWillAppear 在两个视图控制器上
  • 在主视图控制器中,在调用 pushViewController:detailViewController 之前调用联系人详细信息 API
  • 还有其他活动吗?

目前,我主要将 viewWillAppear 用于这种场景,或者在某些特定情况下使用 viewDidAppear,但为了标准化我的编码实践,我肯定会确定这些不同方法的优缺点。

4

3 回答 3

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
            }
        }];
    }
}
于 2013-01-28T23:32:43.350 回答
1

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

有了这个,你有几个选择。从用户的角度来看,就性能而言,最好尽可能多地从您的 RESTful API 中预取。这就是诸如AFIncrementalStore将您的 API 映射到 Core Data 之类的库尝试做的事情。但是,如果您有成千上万的联系人,速率受到严重限制,或者带宽受到限制,这将是一个问题。

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

于 2013-01-28T23:37:16.563 回答
0

我通常这样做:

在 viewWillAppear 上加载联系人,如果您有下拉刷新功能,何时发生。

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

于 2013-01-28T23:32:05.573 回答