2014-04-01 26 views
0

所以我已經陷入了一種情況,出於某種原因,我有我正在保存的數據,但直到我終止該應用程序才完全保存。細節不完全問題,而是通過我的代碼看,我發現了以下內容:多NSManagedObjectContext或傳遞它?

我的應用程序委託我實例

  • 的NSManagedObjectContext
  • NSManagedObjectModel
  • NSPersistentStoreCoordinator

我有一個後臺線程,可以處理和保存大量的數據 - 在這個線程中,我創建了第二個managedObjectContext初始化電話:

- (void)initCoreDataWithNSPersistentStoreCoordinator:(NSPersistentStoreCoordinator *)storeCoordinator andLocationManager:(CLLocationManager *)manager { 
    if (!managedObjectContext) { 

     if (storeCoordinator != nil) { 
      managedObjectContext = [[NSManagedObjectContext alloc] init]; 
      [managedObjectContext setPersistentStoreCoordinator:storeCoordinator]; 
     } 

    } else { 
     NSLog(@"Dual Init attempted!!"); 
    } 

    if (manager != nil) { 
     [self setLocationManager:manager]; 
    } 

    /* Setup a Notification Handler now that COREData is initialized */ 
    [[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(saveContext:) 
               name:@"saveContext" 
               object:nil]; 
} 

放眼天下,我的代碼(這裏我沒有看到保存的問題)實際上,我身邊掠過類似這樣的原始環境與prepareForSegue方法:

// Pass on managedObjectContext 
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { 

    // If the destination VC is able to take teh setManagedObjectContext method the current objectContext will be passed along. 
    if ([segue.destinationViewController respondsToSelector:@selector(setManagedObjectContext:)]) { 
     [segue.destinationViewController performSelector:@selector(setManagedObjectContext:) 
               withObject:_managedObjectContext]; 
    } else { 

     NSLog(@"Segue to controller [%@] that does not support passing managedObjectContext", [segue destinationViewController]); 
    } 
} 

是一個的方法比其他方法「更好」?我猜測雙重背景對我的公正數據刷新負責,但我不確定。但真正的問題是蘋果「偏愛」這些方法之一,如果是的話。另外,無論哪種情況,我需要注意哪些缺陷。

謝謝!

+1

不好 - 適合情況。主要的上下文是用於主線程。您需要使用不同的上下文以用於後臺線程。上面的[[[NSManagedObjectContext alloc] init]是你的實際代碼嗎?你確定你只有一個後臺線程? – Wain

+0

跨線程共享相同的上下文是否存在問題? – Jeef

+0

是的,它不能正常工作...... – Wain

回答

2

在視圖控制器之間傳遞主管理對象上下文是正確的,因爲它們都在主線程上運行。

此問題可能與您的後臺線程管理的對象上下文有關。你應該有一個不同的上下文,因爲重要的是上下文的所有更新都是在正確的線程(隊列)上進行的,但是如果你有多個後臺線程,那麼你當前的代碼會讓它們共享上下文,你會看到的問題。

看看爲每個後臺線程創建不同的上下文。

+0

所以我通過「主」上下文到我的後臺線程,現在所有的問題都消失了 - >但是如果你說我做錯了什麼是強制同步的正確方法? – Jeef

+0

正確是每個線程的不同MOC,其中每個後臺線程將保存的更改合併到主MOC中 – Wain