2016-11-21 124 views
0

我正在使用MagicalRecord,我無法理解如何使其工作穩定且可預測。如何使用MagicalRecord正確保存更新?

當我需要更新一些實體,我從數據庫檢索它們,根據邏輯改變他們,之後那我送他們到我的「節電器」的方法:

- (void) saveEntities:(NSArray *)entities { 
    [MagicalRecord saveWithBlock:^(NSManagedObjectContext *localContext) { 
     for (Entity_class *entityElement in entities) { 
      NSPredicate *entitySearchPredicate = [...] // Composing predicate 
      Entity_class *foundEntity = [Entity_class MR_findFirstWithPredicate:entitySearchPredicate]; 
      foundEntity = entityElement; 
     } 
     [[NSManagedObjectContext MR_defaultContext] MR_saveToPersistentStoreAndWait]; 
    } completion:^(BOOL contextDidSave, NSError *error) { 
     // contextDidSave always equals NO. Sometimes changes get saved, but sometimes they don't    
    }]; 
} 

我試圖挽救本地上下文[localContext MR_saveToPersistentStoreAndWait]而不是默認的,但它從來沒有工作。

第二天晚上我正在爲這些背景努力工作,只是我已經用完了Google的搜索查詢變體。如何處理上下文並正確保存它們?

+0

我只是試圖挽救實體'的背景下[entityElement.managedObjectContext MR_saveToPersistentStoreAndWait]',它的工作原理。我仍然不明白,爲什麼'saveWithBlock:'保存如此難以預測。如果我只需要保存實體的上下文,爲什麼在這個世界上存在這種方法呢? –

回答

0

有使用瞭解幾個重要事項CoreData:

  1. 必須保存使用該實體在創建的上下文 意義,如果實體被他們可能會使用一個不同的線程創建的。不同的上下文,有時可能會導致多線程和大量每秒節省時出現故障。

  2. 「saveWithBlock」方法用於異步保存,這意味着一旦它準備就緒(通常是立即),它將保存上下文,所以如果嘗試立即檢查更改並獲取數據,它可能不會保存尚未。

它將幫助您閱讀有關不同上下文之間的核心數據差異的更多信息 - MainQueue和PrivateQueue。

通常我會用給定的方法:

[[NSManagedObjectContext MR_defaultContext] MR_saveToPersistentStoreAndWait] 

而且

[[NSManagedObjectContext MR_contextForCurrentThread] MR_saveToPersistentStoreAndWait] 

您還可以使用MR_saveToPersistentStoreWithCompletion:異步省電。

這樣可以保存整個上下文而不需要選擇特定的實體。

如果你是新手的話,你也可以檢查CoreDataStack

這是一個較新的和最新的最新的核心數據封裝