好了,解决了这个问题,确切的答案:
核心数据要求每个队列经营着自己的独立managedObjectContext
,这是在队列中,它会创建属于。当数据在managedObjectContext
上被提取时,它将被合并到主队列的管理对象上下文中。要创建背景managedObjectContext
,请为其提供与主队列的managedObjectContext
相同的持久存储协调器。使用此通知,当后台管理对象上下文保存时,更改将发送到主队列并合并。
然后执行提取的好方法是在performBlock:
内部执行,以确保您在右侧进行提取队列。
[_backgroundManagedObjectContext performBlock:^{
// fetch here
}];
完整列表:
@implementation databaseManager {
UIManagedDocument* _databaseManagedDocument;
NSManagedObjectContext* _backgroundManagedObjectContext;
dispatch_queue_t _backgroundContentFetchingQueue;
}
- (id)init
{
self = [super init];
if (self) {
NSURL* url = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
url = [url URLByAppendingPathComponent:@"database"];
_databaseManagedDocument = [[UIManagedDocument alloc] initWithFileURL:url];
_backgroundContentFetchingQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0);
[self openManagedDocument];
}
return self;
}
- (void)initializeBackgroundManagedObjectContext
{
dispatch_async(_backgroundContentFetchingQueue, ^{
NSPersistentStoreCoordinator *coordinator = _databaseManagedDocument.managedObjectContext.persistentStoreCoordinator;
if (!coordinator) {
// Error if we don't have a coordinator.
return;
}
// Create the Background Managed Object Context
_backgroundManagedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
[_backgroundManagedObjectContext setPersistentStoreCoordinator:coordinator];
[_backgroundManagedObjectContext setUndoManager:nil];
// Notify the main queue of changes the background queue makes
[[NSNotificationCenter defaultCenter] addObserverForName:NSManagedObjectContextDidSaveNotification
object:_backgroundManagedObjectContext
queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification *note) {
dispatch_async(dispatch_get_main_queue(), ^{
[_databaseManagedDocument.managedObjectContext mergeChangesFromContextDidSaveNotification:note];
});
}];
});
}
- (void)openManagedDocument
{
if (!([[NSFileManager defaultManager] fileExistsAtPath:[_databaseManagedDocument.fileURL path]])){
[_databaseManagedDocument saveToURL:_databaseManagedDocument.fileURL forSaveOperation:UIDocumentSaveForCreating completionHandler:^(BOOL success){
if (success) {
[self initializeBackgroundManagedObjectContext];
} else NSLog(@"Database document creation error");
}];
} else if (_databaseManagedDocument.documentState == UIDocumentStateClosed) {
[_databaseManagedDocument openWithCompletionHandler:^(BOOL success){
if (success) {
[self initializeBackgroundManagedObjectContext];
} else NSLog(@"Database document opening error");
}];
} else if (_databaseManagedDocument.documentState == UIDocumentStateNormal) {
[self initializeBackgroundManagedObjectContext];
}
}
- (void)dealloc
{
dispatch_release(_backgroundContentFetchingQueue);
}
@end
希望我没有错过任何东西。原帖在这里:POST