RestKit,核心数据,神奇的记录,大量的数据和滞后的UI

问题描述:

我有一个存储餐馆数据的应用程序。他们的菜单,时间表等。 Theres〜200家餐馆在DB。该应用程序用于一次性检索这些地方,但加载时间过长,因此我决定一个接一个地加载数据。在开始的应用程序要求服务器的地方的ID数组,然后通过API获取数据。RestKit,核心数据,神奇的记录,大量的数据和滞后的UI

我将RK的操作完成块设置为后台队列,但没有帮助。滚动运行不够流畅,有时甚至是应用程序死锁(原文!)或崩溃,控制台中没有输出错误。我试过使用仪器来查找是什么让UI变干,但没有成功。我甚至关闭了图像加载和排序功能。我曾经有RK的请求调用包装在@synchronized,所以我删除它,但没有效果。

从来没有想过我会遇到这种问题后,几个星期的Objective-C经验。我想尽办法想到,所以现在我有点放弃了。

请帮我:)

下面的代码被200次应用开始后立即调用。

NSURLRequest *request = [[DEAPIService sharedInstance].manager requestWithObject:nil 
                       method:RKRequestMethodGET 
                       path:path 
                      parameters:params]; 
    //DLog(request.URL.absoluteString); 

    NSManagedObjectContext *context = [NSManagedObjectContext MR_contextWithParent:[NSManagedObjectContext MR_contextForCurrentThread]]; 

    RKManagedObjectRequestOperation *operation = [[DEAPIService sharedInstance].manager managedObjectRequestOperationWithRequest:request 
                             managedObjectContext:context 
                                 success:success 
                                 failure:failure]; 

    // dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0); 
    dispatch_queue_t backgroundQueue = dispatch_queue_create("com.name.bgqueue", NULL); 
    operation.successCallbackQueue = backgroundQueue; 

    [[DEAPIService sharedInstance].manager enqueueObjectRequestOperation:operation]; 

响应描述符在此之前设置。而且DB中有很多关系。我查了数据库的文件大小 - 大概是1.5Mb。我想知道如果超过1k餐馆会发生什么。这是加载这种数据的好方法吗?什么是最佳实践?

+0

你是怎么来这里使用RK&MR的? – Wain

+0

您是否有使用MR的原因,以及您自己为请求操作创建队列的原因? – Wain

+0

我不是应用程序的作者,所以我不知道为什么以前的人这样做。我检出了MR的代码,它只是使用并发类型NSPrivateQueueConcurrencyType来初始化子上下文。 MR被用于所有的应用程序,我想为了方便,例如,你可以通过一行代码获取DB中的第一个对象:APPlace * place = [APPlace MR_findFirst]; – Alexander

好的,从提供的信息你应该能够简化很多。目前你的代码正在下降到一个较低的水平,并且参与了你想要离开RestKit进行整理的线程和上下文管理。你有一个正确配置的对象管理器和核心数据堆栈的外观,所以你应该让它做的工作。

这意味着删除请求,上下文和请求操作代码,并简单地调用`getObjectsAtPath:parameters:success:failure:'。然后RestKit将处理后台中的所有下载和映射并保存上下文。

您还应该在整个应用程序中真正使用抓取的结果控制器,如果是的话,他们会自动检测RestKit保存并更新UI的更改。

一旦你有了,UI的任何阻塞都与RestKit和你的下载需求无关,并应该与后续的图像管理/下载有关。

+0

它部分帮助,但仍然滚动有点生涩。问题在哪里呢?可能涉及关系吗?一个Place对象有4个。这是一个响应描述符设置:https://gist.github.com/anonymous/846599751c215a49acf5 而且我确实有一个抓取结果控制器,即使如此,我还没有如何将它实际提取到核心数据。我曾经对内容的UI更新进行了更改,但它每秒被调用很多次,所以我删除了参考。 – Alexander

+0

RK在后台执行所有数据处理,所以除非您充斥CPU,否则不会导致UI滞后。你可能应该问一个新的问题,它显示了当FRC选择一个变更时你必须更新UI的代码。分析也应该帮助您现在找到问题。 – Wain