2014-06-16 33 views
3

我很想理解關於MagicalRecord和CoreData的一切。假設我有兩塊代碼做同樣的事情,其中​​tallyM是一個在MR_defaultContext中運行的託管對象。MagicalRecord saveWithBlock vs saveToPersistentStoreAndWait

選項1:

Tally *tallyM      = (Tally *)[Tally MR_findFirstWithPredicate:predicateM]; 

[MagicalRecord saveWithBlock:^(NSManagedObjectContext *localContext) { 

    Tally *tallyMLocal    = [tallyM MR_inContext:localContext]; 
    tallyMLocal.tl_countMale  = [NSString stringWithFormat:@"%ld", (long)uiTallyMaleCounter]; 

} completion:^(BOOL success, NSError *error) { 

     [self updateTallies_APICall:[tallyM MR_inContext:[NSManagedObjectContext MR_defaultContext]]]; 
}]; 

選項2:

Tally *tallyM      = (Tally *)[Tally MR_findFirstWithPredicate:predicateM]; 
tallyM.tl_countMale     = [NSString stringWithFormat:@"%ld", (long)uiTallyMaleCounter]; 
[tallyM.managedObjectContext MR_saveToPersistentStoreAndWait]; 
[self updateTallies_APICall:[tallyM MR_inContext:[NSManagedObjectContext MR_defaultContext]]]; 

問題:

  1. 哪一個更好?我明白,當你需要異步保存時,可以使用saveWithBlock,但是還有其他區別嗎?是選項1更安全或更好選項2

  2. 選項1,我有tallyM運行在MR_defaultContext。然後在saveWithBlock裏面,我改變tallyM,改變tallyMLocal,並保存上下文。我可以100%確定在saveWithBlock運行後,在完成處理程序中(當我需要繼續使用tallyM時),tallyM(它仍在MR_defaultContext中運行)將會更新tl_countMale?

  3. 選項1,在完成處理程序中,我仍然需要調用下面的代碼嗎?我假設(已經使用控制檯進行了檢查,但只是想確定),在執行saveWithBlock後,tallyM仍然在MR_defaultContext中運行。那麼是否需要再次調用MR_inContext?

    [tallyM MR_inContext:[的NSManagedObjectContext MR_defaultContext]

  4. 比方說,我不需要異步保存在所有。所以我可以使用選項2saveWithBlockAndWait。是saveWithBlockAndWait以任何方式比選項2

我只是想確保我終於正確理解了MagicalRecords和CoreData的行爲方式。

回答

3

就我個人而言,我會避免選項2中的模式。這個想法是,您應該使用單個受管對象上下文作爲受管對象集合上的操作範圍。這就是爲什麼大多數示例使用以下模式:

NSManagedObjectContext *localContext = //...; 
NSManagedObject *localObject = [otherObject MR_inContext:localContext]; 
///make changes to localObject 
[localContext MR_saveToPersistentStoreAndWait]; 

的〔MagicalRecord saveWithBlock:]方法基本上以更方便的API實現這種模式。

我也建議不要隱式使用defaultContext。在代碼中更明確一些,因爲當你的應用程序開始處理線程時,你可能需要將其交換出來。

完成處理程序的寫入方式是在保存操作100%完成後總是回調它們。我建議閱讀源代碼以親自查看。