让我们来看一个典型的RESTful iOS应用程序,比如一个联系人应用程序,主屏幕是联系人列表,当你点击联系人时会看到联系人详细信息屏幕。
联系人列表是通过REST API获得的,联系人详细信息是通过另一个API获得的。
您将使用哪个事件来触发对这些API的调用:
目前我正在使用viewWillAppear主要用于这种情况,或者在某些特定情况下使用viewDidAppear,但为了使我的编码实践标准化,我想明确地解决这些不同方法的优点/缺点。
答案 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
而不是viewWillAppear
或viewDidAppear
可能效果更好:您可以使用加载/保留图形或动画设置视图,触发异步网络通话,然后一旦完成显示所需的信息。
答案 2 :(得分:0)
我通常这样做:
在viewWillAppear上加载联系人,如果有拉动刷新,则会发生这种情况。
当用户点击单元格时,在处理该事件的方法中,加载事件详细信息,并将该对象传递给联系人详细信息控制器的构造函数,然后将其推送。