
挑战在于MovIEDetailController被立即推送到导航堆栈,并且在未检索到细节的情况下持续一两秒,视图显示一堆空白字段,这是不合需要的.
为了解决这个问题,我想让MovIEListController不立即将MovIEDetailController推入堆栈.相反,它会建立一个进度指示器(我正在使用SVProgressHUD),然后调用MovIEDetailController的initWithMovIEID:方法,该方法将启动http调用.然后,当接收到数据时,MovIEDetailController将回调到MovIEListController以删除进度指示器,然后将MovIEDetailController推送到导航堆栈.
这种情况有更好的模式吗?我应该考虑让MovIEDetailController在准备就绪时将其自身推送到导航堆栈吗?
注意:我已经考虑过加载详细信息视图并设置一个活动指示器,但你仍然可以看到它背后的“空视图”看起来有点奇怪.我还考虑让MovIEListController自己检索细节,但这似乎打破了封装模型 – MovIEListController应该只关注列出电影,而不是关于它们的细节.
有什么想法吗?这个电影的东西只是一个例子 – 在这里寻找一般模式.
解决方法 在这种情况下,我个人会回到模型 – 视图 – 控制器模式.有几个系统应用程序显示对象列表中的详细信息视图,例如日历,联系人等.据推测,与其各自应用程序中的EKEvent和ABPerson一样,主视图控制器维护模型对象的列表.当用户选择其中一个项目时,主视图控制器将所选模型对象传递给详细视图控制器.详细视图控制器本身不必进行任何数据加载.因此,就像@ChrisWagner所说,我们希望将逻辑与视图控制器分开.
方法
同样,您可能希望使用存储MovIE对象数组的MovIEList类.每个电影都存储详细视图控制器中所有字段的值 – 实质上是应用程序所需的有关电影的所有信息.例如,您可能具有属性Nsstring * movIETitle或NSDate * premIEreDate. movIETitle将由MovIEList在初始化时设置,因为它只是元数据;另一方面,如果数据未加载,则premIEreDate可能为nil,因此您将拥有一个属性BOol isLoaded来检查此条件.
然后,您可以采用以下两种方式之一:
1)假设主视图控制器想要推送电影的详细视图控制器.然后主视图控制器将从MovIEList中挖出适当的MovIE并检查它是否已加载.如果没有,它会在电影上调用类似 – (voID)loadContents的内容.当模型对象完成加载时,它将发布一个已完成加载的通知.此时,主视图控制器将关闭其进度视图并推送详细视图.如果使用(1),则使用MovIEList协调器并不重要.
2)如果你想更加积极地加载电影信息,你可以在MovIEList上实现一个方法,在后台调用其电影上的loadContents.然后,当用户选择电影时,已经加载电影的可能性更高.
编辑:请注意,如果您决定使用MovIEList类型对象,则只允许主视图控制器访问此列表.在某种程度上,我所描述的模型结构与视图控制器结构平行.详细视图控制器不知道列表视图控制器,因此它也不应该知道MovIEList.
效益
使用此MovIE和MovIEList结构的好处是数据模型与视图控制器完全分离.这样,用户可以在加载数据时自由取消,选择,显示和关闭视图控制器. (想象一下,如果用户按下Back以关闭进度HUD,取消它将收集的任何http数据.然后,如果他决定回到同一部电影,则新的详细视图控制器必须重新开始加载.)此外,如果您决定在开发过程中替换视图控制器类,您不必复制和粘贴一堆数据处理代码.
我认为您会发现以这种方式构建您的应用程序不仅可以为您和用户提供更多自由,还可以使您的应用程序高效并对以后的扩展开放. (抱歉发布这么晚了,但我想在这个与模式相关的讨论中加入MVC!)
总结以上是内存溢出为你收集整理的ios – 用于预加载要显示的后续视图的数据的模式全部内容,希望文章能够帮你解决ios – 用于预加载要显示的后续视图的数据的模式所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)