在我的应用程序中,我尝试将MagicalRecord + AFNetworking + NSFetchedResultsController一起使用,以同步数据并在地图或tableView中动态显示它。
让我们看一些下载方法的代码:
+ (void) getDataWithCompletionBlock: (void (^)(void)) block {
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:URL_GET_DATA]];
AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
for (NSDictionary *dict in JSON) {
[MyModel createOrUpdateMyModelFromDict:[dict mutableCopy]];
}
[[NSManagedObjectContext MR_contextForCurrentThread] MR_saveInBackgroundCompletion:^{
[[NSManagedObjectContext MR_contextForCurrentThread] MR_saveNestedContexts];
block();
}];
});
} failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON) {
DDLogError(@"getDataWithCompletionBlock FAILURE: %@", error);
}];
[operation start];
}
我使用AFJSONRequestOperation
下载数据,然后使用GCD和后台线程创建模型,保存当前线程的上下文并执行successBlock
(MagicalRecord在successBlock
上运行dispatch_get_main_queue()
,所以它在GUI线程中调用。
此同步模型可以吗?因为有时候(通常在真实设备而不是模拟器上)我从NSFetchedResultsController
得到一些错误,例如“索引处没有对象:索引处的部分:”或“CoreData无法解决错误......”。
他们都暗示,Core Data和多线程环境存在问题。有没有人试图连接所有这三个工具一起工作?如果是这样,我错过了什么?您是否为该架构提供了任何良好的代码示例?
答案 0 :(得分:2)
我建议使用:
[MagicalRecord saveWithBlock:(void(^)(NSManagedObjectContext *localContext))block];
它为您处理线程,因此您不必担心从背景上下文中保存在父上下文中的任何内容。
我强烈建议您阅读此博客文章(由MagicalRecord Saul Mora的创作者撰写):IMPORTING DATA MADE EASY。它是关于MagicalRecord工作的超级好背景信息,以及如何使用它的例子。
如果您正确设置了数据模型,您实际上可以让MagicalRecord为您完成所有映射,您只需在importFromObject:
块内调用saveWithBlock:
即可,您无需担心关于处理映射。我上面链接的文章详细介绍了如何正确地完成它,但需要一些练习。