对于我的应用程序,我从核心数据存储中获取了很多对象,这会导致应用程序冻结并阻止所有 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);
}];
}
}];