我是 Magical Record 的新手,但已经在 stackoverflow 上看到了一些问题,但找不到我的问题的答案。
我必须使用这种类型的构造来查找带有谓词的项目:
NSArray *result = [MOSomeItems MR_findAllWithPredicate:predicate];
在主线程上,结果返回一些值,但 UI 冻结。
使用此构造时,结果返回 nil 值:
dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
NSArray *result = [MOSomeItems MR_findAllWithPredicate:predicate];
});
在后台获取数据的最佳实践是什么?
您需要使用带有专用队列的上下文,然后使用获取的 ID 从主上下文中提取结果。
// Create a child context of our main context
NSManagedObjectContext *privateContext = [NSManagedObjectContext MR_context];
// When using private contexts you must execute the core data code in it's private queue using performBlock: or performBlockAndWait:
[privateContext performBlock:^{
// Execute your fetch
NSArray *privateObjects = [MOSomeItems MR_findAllWithPredicate:predicate inContext:privateContext];
// Convert your fetched objects into object IDs which can be pulled out of the main context
NSArray *privateObjectIDs = [privateObjects valueForKey:@"objectID"];
// Return to our main thread
dispatch_async(dispatch_get_main_queue(), ^{
// Create a new predicate to use to pull our objects out
NSPredicate *mainPredicate = [NSPredicate predicateWithFormat:@"self IN %@", privateObjectIDs];
// Execute your fetch
NSArray *finalResults = [MOSomeItems MR_findAllWithPredicate:mainPredicate];
// Now you can use finalResults however you need from the main thread
});
}];
您还可以使用 -[NSManagedObjectContext objectWithID:] 方法拉出对象,将 privateObjectIDs 数组中的每个对象作为参数传递,但这种方法更短。我还建议您考虑创建一个提取请求(MagicalRecord 有一个 MR_fetchAllWithPredicate: 方法),设置批量大小,然后手动执行提取。这将允许 Core Data 以块的形式提取数据,所有这些都在返回数组的幕后进行,以防止线程阻塞。
希望有帮助!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)