Ios 如果我知道用户很可能很快就会选择视图控制器,如何提前加载它?
在我的应用程序中,我做的一些研究表明,当用户查看一篇文章时,绝大多数时间(85%+)他们都会加载与文章一起附带的评论视图控制器 我希望在他们阅读文章时加载此视图控制器,因此当他们点击comments按钮转换到comments视图控制器时,视图控制器已准备就绪,无需任何加载时间 我怎样才能完成这样的事情呢?当用户点击按钮时,我调用Ios 如果我知道用户很可能很快就会选择视图控制器,如何提前加载它?,ios,objective-c,cocoa-touch,uiviewcontroller,Ios,Objective C,Cocoa Touch,Uiviewcontroller,在我的应用程序中,我做的一些研究表明,当用户查看一篇文章时,绝大多数时间(85%+)他们都会加载与文章一起附带的评论视图控制器 我希望在他们阅读文章时加载此视图控制器,因此当他们点击comments按钮转换到comments视图控制器时,视图控制器已准备就绪,无需任何加载时间 我怎样才能完成这样的事情呢?当用户点击按钮时,我调用performsguewithidentifier:并将我在故事板中设置的标识符传递给它 显然,对于用户决定返回到根视图控制器(例如,文章列表)的情况,我希望取消该注释视
performsguewithidentifier:
并将我在故事板中设置的标识符传递给它
显然,对于用户决定返回到根视图控制器(例如,文章列表)的情况,我希望取消该注释视图控制器的加载,因为此时继续加载将是浪费。如果将数据模型与UI分开,您应该不会在动态创建视图时遇到任何问题,而且从早期创建视图中几乎没有任何收获 一种合理的标准方法是使用空白或填充数据引入视图,并将数据调用转到中间层,使用异步处理程序处理回调 使用iOS 7风格的NSURLSession中提供的基于块的完成处理程序,这要容易得多,而使用NSURLConnection(它在主线程上侦听响应,但一旦捕获到响应,就可以抛出到后台)则要稍微困难一些
所以我的建议是将重点放在数据调用和响应的背景上,并强烈区分显示UI和用数据填充UI。如果您的数据管理器与视图控制器是分开的,那么没有什么可以阻止您提前“预取”数据,然后在视图控制器需要时准备好数据。对于高价值数据来说,这是一种非常正常的负载平衡/客户体验技术。我将要描述的解决方案有点像黑客——它实际上不符合Ryan提到的正确的模型-视图-控制器设计模式。话虽如此,它可能会给你一个如何进行的想法。也许你可以改进一下,使它更干净 首先,在应用程序委托中定义一个
@protocol
。让我们将此协议称为CommentQueryLegate;它应该定义一个名为-(void)handleCommentQuery
的方法。还为应用程序委托指定一个用于存储注释数据的强属性和一个用于存储委托对象的弱属性,如下所示:
@property (nonatomic, strong) NSMutableArray* arrayOfComments;
@property (nonatomic, weak) id<CommentQueryDelegate> commentQueryDelegateObject;
如果在用户进入comments视图之前完成查询,则handleCommentQuery
消息将发送到nil
对象,该消息将无效
现在,在comments视图控制器的viewDidLoad
方法中,将App委托的commentQueryDelegateObject
属性设置为self
。您需要指定注释视图控制器符合注释查询协议。接下来,检查应用程序委托的arrayOfComments
属性是否为nil
。如果不是,很好-立即显示评论。否则,显示ui活动指示灯视图
在comments视图控制器中实现-(void)handleCommentQuery
方法。此方法应禁用活动指示器并显示注释
最后一件要考虑的事情——指向<代码> > ArayOFFutue< /Cord>对象的强指针将使它不被解除分配,因此,一旦您完成了文章视图控制器,就应该将此指针设置为dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^
{
AppDelegate *appDelegate = (AppDelegate*)[[UIApplication sharedApplication] delegate];
// query your database here
appDelegate.arrayOfComments = [NSMutableArray array];
[appDelegate.arrayOfComments addObject:@"someComment"];
[appDelegate.commentQueryDelegateObject handleCommentQuery];
}