yar*_*iko 4 core-data freeze ios background-thread magicalrecord
我是魔法记录的新手,但已经在stackoverflow上看到了一些问题,但无法找到我的问题的答案.
我必须使用这种类型的结构找到带有谓词的项:
NSArray *result = [MOSomeItems MR_findAllWithPredicate:predicate];
Run Code Online (Sandbox Code Playgroud)
在主线程结果返回一些值,但UI是冻结.
使用此构造时,结果返回nil值:
dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
NSArray *result = [MOSomeItems MR_findAllWithPredicate:predicate];
});
Run Code Online (Sandbox Code Playgroud)
在后台获取数据的最佳做法是什么?
Jam*_*ard 16
您需要使用具有专用队列的上下文,然后使用获取的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
});
}];
Run Code Online (Sandbox Code Playgroud)
您还可以使用 - [NSManagedObjectContext objectWithID:]方法拉出对象,将privateObjectIDs数组中的每个对象作为参数传递,但这种方式更短.我还建议您研究创建一个获取请求(MagicalRecord有一个MR_fetchAllWithPredicate:方法),设置批量大小,并手动执行提取.这将允许Core Data以块的形式提取数据,所有这些都在返回的数组的幕后,以防止阻塞您的线程.
希望有所帮助!
| 归档时间: |
|
| 查看次数: |
3926 次 |
| 最近记录: |