Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如果我知道用户很可能很快就会选择视图控制器,如何提前加载它?_Ios_Objective C_Cocoa Touch_Uiviewcontroller - Fatal编程技术网

Ios 如果我知道用户很可能很快就会选择视图控制器,如何提前加载它?

Ios 如果我知道用户很可能很快就会选择视图控制器,如何提前加载它?,ios,objective-c,cocoa-touch,uiviewcontroller,Ios,Objective C,Cocoa Touch,Uiviewcontroller,在我的应用程序中,我做的一些研究表明,当用户查看一篇文章时,绝大多数时间(85%+)他们都会加载与文章一起附带的评论视图控制器 我希望在他们阅读文章时加载此视图控制器,因此当他们点击comments按钮转换到comments视图控制器时,视图控制器已准备就绪,无需任何加载时间 我怎样才能完成这样的事情呢?当用户点击按钮时,我调用performsguewithidentifier:并将我在故事板中设置的标识符传递给它 显然,对于用户决定返回到根视图控制器(例如,文章列表)的情况,我希望取消该注释视

在我的应用程序中,我做的一些研究表明,当用户查看一篇文章时,绝大多数时间(85%+)他们都会加载与文章一起附带的评论视图控制器

我希望在他们阅读文章时加载此视图控制器,因此当他们点击comments按钮转换到comments视图控制器时,视图控制器已准备就绪,无需任何加载时间

我怎样才能完成这样的事情呢?当用户点击按钮时,我调用
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>对象的强指针将使它不被解除分配,因此,一旦您完成了文章视图控制器,就应该将此指针设置为nIL/COD>。仅在用户请求时加载它的成本是多少?我认为你的想法值得追求;我主要好奇的是您希望提供的好处。@B几乎可以推测这些评论都存储在服务器端。。。我认为在用户阅读文章时查询数据库将显著减少comments视图控制器的加载时间。是的,我的想法也是关于外部资源的。我认为@Aloha64应该改为查看预取模型数据。@B我明白你的意思-视图控制器本身的加载时间与等待查询返回的时间相比微不足道。我在我的应用程序中使用了类似的滑动手势触发一个序列,并且没有因实例化而引起的明显延迟目标视图控制器。视图占用了合理的内存,因此我建议您采纳@bneely的建议,在用户阅读文章时集中精力开始查询。我将很快发布一个答案,解释将注释列表传递到目标视图控制器的一种方法。我想我可以更具体地针对您的特定情况,这里有一种可能的方法:当文章加载时,您告诉您的数据管理器获取并存储注释。当用户点击“注释”按钮时,您加载UI并用存储的注释填充它(如果有的话,服务器可能还没有响应…),并发出一个新的调用来检查预取后所做的任何较新注释,在这些注释到达时用这些注释异步更新UI。我对一些细节和一些你必须处理的乏味的协调工作感到困惑,但这是基本的想法。

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];
}