用于预加载要显示的后续视图的数据的模式

Mar*_*oft 4 objective-c uikit ios

非常简单的用例:假设一个iOS应用程序显示一个带有电影列表的MovieListController视图(在a内UINavigationController).当用户触摸一个上,应用程序推送MovieDetailController到导航堆(即[[MovieDetailController alloc] initWithMovieId:(NSString *),在MovieDetailController的viewDidAppear:方法,它使一个HTTP调用来检索基于传给它的电影ID的信息.

挑战在于,它MovieDetailController被立即推送到导航堆栈,并且在未检索到细节的情况下持续一两秒,视图显示了一堆空白字段,这是不合需要的.

为了解决这个问题,我正在考虑MovieListController不要立即将其MovieDetailController推入堆栈.相反,它提出了一个进度指示器(我使用SVProgressHUD),然后调用MovieDetailController的initWithMovieId:这将揭开序幕HTTP调用方法.然后,当接收到数据时,MovieDetailController将回调回去MovieListController以删除进度指示器,然后将其推MovieDetailController送到导航堆栈.

这种情况有更好的模式吗?我是否应该考虑在MovieDetailController准备就绪时将其自身推入导航堆栈?

注意:我已经考虑过加载详细视图并设置一个活动指示器,但你仍然可以看到它后面的"空视图"看起来有点奇怪.我也考虑过只MovieListController检索细节本身,但这似乎打破了封装模型 - MovieListController应该关注列出电影,而不是关于它们的细节.

有什么想法吗?这个电影的东西只是一个例子 - 在这里寻找一般模式.

Chr*_*ner 5

我个人会采取以下方法.

  1. 用户选择他们想要的详细信息
  2. 推送到详细视图,而不是显示带有空字段的骨架视图,覆盖加载视图,您可以继续使用您的进度HUD,以获得您获得的任何动画.
  3. 结果结束后,删除HUD和隐藏所有数据/字段的加载覆盖视图

我之所以选择此路线而不是在推动视图控制器之前显示HUD,是因为您可以让用户取消他们的选择.我并不熟悉,SVProgressHUD但希望在显示HUD时你可以启用触摸,特别是用户触摸你UINavigationController在他们意外选择了电影的情况下回来,或者请求的时间比他们愿意等待的时间长.

它还将列表视图中的逻辑分开,您的详细信息视图是独立的,可以在应用程序的任何位置进行初始化(可能您希望在电影详细信息视图中交叉链接类似的电影),并且您无需重写演示的逻辑查看等待结果回来.