RestKit,核心数据,魔法记录,大量数据和滞后UI

时间:2015-04-07 00:40:29

标签: ios core-data restkit magicalrecord ui-thread

我有一个存储餐馆数据的应用程序。他们的菜单,时间表等。 到目前为止,DB中有200家餐馆。该应用程序用于一次性检索这些地方,但加载时间太长,所以我决定逐个加载数据。在启动应用程序向服务器请求一个地方ID的数组,然后通过API获取数据。

我将RK操作的完成块设置为后台队列,但它没有帮助。滚动运行不够平稳,有时应用程序甚至死锁(原文如此!)或崩溃,控制台中没有错误输出。我曾尝试使用Instruments找到导致UI变得生涩的原因,但没有成功。我甚至关闭了图像加载和排序功能。我以前用@synchronized包含RK的请求调用,所以我删除它,但没有效果。

从未想过在使用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中还有很多关系。我已查询了DB的文件大小 - 它的大小为1.5Mb。我想知道如果有超过1k的餐馆将会发生什么。这是加载此类数据的好方法吗?什么是最佳实践?

1 个答案:

答案 0 :(得分:1)

好的,根据提供的信息,您应该能够简化很多。目前,您的代码正在下降到较低级别并参与线程和上下文管理,您希望让RestKit进行整理。你有一个正确配置的对象管理器和核心数据堆栈,所以你应该让它完成工作。

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

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

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