对于我的应用程序,我从核心数据存储中获取了很多对象,这会导致应用程序冻结并阻止所有 UI 输入。我想在应用程序保持响应时在后台进行获取,并且tableview仅在数据可用时更新。
 
为此,我设置了一个新NSManagedObjectContext的,NSPrivateQueueConcurrencyType并将其作为主 MOC 的子级。虽然我的设置正在返回所需的对象,但似乎所有处理仍在冻结 UI,并且与在主队列上发生所有事情的旧代码的响应能力几乎没有区别。
根据这篇文章,子上下文设置无助于保持 UI 响应,而我读到的网络上的其他任何地方,如果你想从繁重的处理中减轻主队列的负担,这是要走的路吗?我错过了什么吗?
  NSManagedObjectContext *mainMOC = self.mainObjectContext;
  NSManagedObjectContext *backgroundMOC = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
    [backgroundMOC setParentContext:mainMOC];
    [backgroundMOC performBlock:^{
        //query for objects
        NSArray *results = [Product MR_findAllInContext:backgroundMOC];
            NSError *childError = nil; 
            [backgroundMOC save:&childError]; 
        if ( [results count] > 0 ) {
            //get objectIDs
            NSMutableArray *objectIDs = [NSMutableArray array]
            for (NSManagedObject *object in results) {
            [objectIDs addObject:[object objectID]];
            }
            [mainMOC performBlock:^{
                //refetch objects on the mainQueue
                NSMutableArray *persons = [NSMutableArray array]
                for (NSManagedObjectID *objectID in objectIDs) {
                [persons addObject:(Person*)[mainMOC objectWithID:objectID]];
                }
                 //return result
                 if (self.callBack)
                 self.callBack(persons);
            }];
        }
    }];