替代没有阻止主线程的MR_findFirstWithPredicate?

时间:2014-04-11 00:08:31

标签: ios core-data magicalrecord

使用MR进行简单的提取:

    Cat* cat = [Cat MR_findFirstWithPredicate:predicate];

Time Profiler将此标记为我的应用中最吸引时间的进程之一。事实上,MR_findFirstWithPredicate的堆栈跟踪导致了这一点:

+ (NSArray *) MR_executeFetchRequest:(NSFetchRequest *)request inContext:(NSManagedObjectContext *)context
{
    __block NSArray *results = nil;
    [context performBlockAndWait:^{

        NSError *error = nil;

        results = [context executeFetchRequest:request error:&error];

        if (results == nil) 
        {
            [MagicalRecord handleErrors:error];
        }

    }];
    return results; 
}

请注意“performBlockAndWait”,它是问题的根源。那么替代方案是什么?如何在后台执行提取?

1 个答案:

答案 0 :(得分:3)

在非主线程上的托管对象上下文中执行查找将阻止主线程被阻止:

NSManagedObjectContext *backgroundContext = [NSManagedObjectContext MR_context];
[backgroundContext performBlock:^{
    Cat* cat = [Cat MR_findFirstWithPredicate:predicate inContext:backgroundContext];
}];

正如上面Koen所建议的,这不是MagicalRecord的概念 - 它是Core Data的关键部分。虽然MagicalRecord可以让核心数据中的某些东西变得更简单一些,但是理解核心数据的工作原理和原因也会对您有所帮助。