使用 MagicalRecord 在后台执行获取请求

Posted

技术标签:

【中文标题】使用 MagicalRecord 在后台执行获取请求【英文标题】:Executing fetch requests in the background using MagicalRecord 【发布时间】:2014-04-01 19:16:16 【问题描述】:

这是我目前所拥有的:

NSManagedObjectContext *privateContext = [NSManagedObjectContext MR_context];
[privateContext performBlock:^
        Cat* object = [Cat MR_findFirstByAttribute:@"id" withValue:catId inContext:privateContext];
        // Convert your fetched objects into object IDs which can be pulled out of the main context
        NSString *privateObjectID = [object valueForKey:@"objectID"];

        // Return to our main thread
        dispatch_async(dispatch_get_main_queue(), ^
            ???
        );
    ];

这是正确的做法吗?如果是这样,我如何让我的对象回到主线程? (上面的???区域)

如果我这样做:

NSManagedObjectContext* context = [NSManagedObjectContext MR_contextForCurrentThread];
Cat* object = [Cat MR_findFirstByAttribute:@"id" withValue:catId inContext:context];

UI 被阻塞,所以我试图弄清楚如何在不阻塞主线程的情况下进行提取。

【问题讨论】:

【参考方案1】:

块内的代码(在主线程上执行的代码)应该是:

NSManagedObjectContext* c = [NSManagedObjectContext MR_contextForCurrentThread];
Cat* o = (Cat*)[context objectWithID:object.objectID];
//access `o` so it will get faulted in by the main context
//I think you could use: [o valueForKey:nil] or [o didAccessValueForKey:nil]

重要的是在从主上下文访问它们时将 BG 获取的对象保留在(协调器)缓存中。

【讨论】:

以上是关于使用 MagicalRecord 在后台执行获取请求的主要内容,如果未能解决你的问题,请参考以下文章

Magical Record - 在主线程块 ui 中获取,在后台返回 nil

使用 MagicalRecord 在后台保存的设计策略

在后台线程中使用 MagicalRecord 和 NSXMLParser

MagicalRecord:后台导入数据,访问刚导入的数据

如何确保在使用 MagicalRecord 3.0 保存后台线程后通知 NSFetchedResultsController

MagicalRecord:后台保存