2013-08-02 24 views
1

如何为已创建的UIManagedDocument创建managedObjectContext并将其与全局调度队列相关联?或者什么是创建managedObjectContext的正确方法。为已创建的UIManagedDocument创建后台队列的managedObjectContext

信息:我一起对付我managedObjectContext在最原始的办法,只是通过创造它与managedDocument _managedDocument = [[UIManagedDocument alloc] initWithFileURL:url];

然而,这将与主队列,这是我想避免managedObjectContext相关联,并将其与此队列相关联。

_backgroundQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0); 

这样做的正确方法是什么?

回答

2

好了,解决了这个问题,确切的答案:

核心数据要求每个队列经营着自己的独立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