2014-11-03 33 views
0

我正在使用MagicalRecord。保存一些ManagedObject(例如「公司」)後,我立即發送通知以重新加載公司的TableView並創建其他對象(例如「People」)。核心數據MagicalRecord:獲取請求並保存爲多線程。鎖定獲取的對象?

每種方法 「addPeople」 執行[Company findAllWithPredicate:[email protected]"(lastUpdateDate == nil)"]和產生arrayOfCompany

然後我重複arrayOfCompanyenumerateObjectsWithOptions:NSEnumerateConcurrent。 長時間的每次迭代。

正如在接下來的截距通知的結果,並調用「addPerson的」返回公司的相同的對象。並且在每個創建的線程中,我都使用相同的對象。

如何鎖定公司fetchRequest期間對象?

代碼示例:

先打電話:

+ (void)addCompany 
{ 
    ... 
    [arrayOfCompanies enumerateObjectsWithOptions:NSEnumerateConcurrent 
             usingBlock:^(Company *obj, NSUInteger idx, BOOL *stop) 
    { 
     [MagicalRecord saveWithBlock:^(NSManagedObjectContext *localContext){ 
      Company *company = [Company createEntityInContext:localContext]; 
      .... 
     } 
     completion:^(BOOL contextDidSave, NSError *error){ 
      if (contextDidSave) 
      { 
       [[NSNotificationCenter defaultCenter] postNotificationName:@"newCompanyJustAdded" 
                    object:nil]; 
      } 
     }]; 
    }]; 
} 

通知捕獲:

+ (void)newCompanyJustAdded:(NSNotification *)notification 
{ 
    [Person addPersons]; 
} 

+ (void)addPersons 
{ 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
     predicate = @"(lastUpdateDate == nil)"; 
     NSArray *companysInCoreData = [Company findAllWithPredicate:predicate]; 

     [companysInCoreData enumerateObjectsWithOptions:NSEnumerateConcurrent 
              usingBlock:^(id obj, NSUInteger idx, BOOL *stop) 
     { 
      NSManagedObjectContext *local_context = [NSManagedObjectContext contextForCurrentThread]; 
      Company *local_company_obj = [obj inContext:local_context]; 
      ... 
      local_company_obj.lastUpdateDate = [NSDate date]; 
      [local_context saveToPersistentStoreAndWait]; 
      ... 
      ... 
      [MagicalRecord saveWithBlock:^(NSManagedObjectContext *localContext) 
      { 
       Person *person = [Person createEntity]; 
       person.name = ... 
       ... 
      }); 
     }]; 
    }); 
} 

而我秒OND問題:

什麼是正確的:

[MagicalRecord saveWithBlock:^(NSManagedObjectContext *localContext) 
{ 
    [someArray enumerateObjectsWithOptions:usingBlock 
    { 

    } 
}]; 

[someArray enumerateObjectsWithOptions:usingBlock 
{ 
    [MagicalRecord saveWithBlock:^(NSManagedObjectContext *localContext) 

    } 
]; 

回答

0

對於第一個問題,不做任何的選項。相反,請使用NSFetchedResultsController

對於第二個問題,你的第一個選項是正確的選項。您應打開一個上下文並執行所有更改,並讓「魔法記錄」處理保存所有更改。

如果使用第二個選項去了,你仍然可以執行相同數量的行動,但你會開放很多情況下。

第一種選擇:

saveWithBlock: // Called once 
enumerateObjectsWithOptions: // Called once 

第二個選項

saveWithBlock: // Called many times (once for each object) 
enumerateObjectsWithOptions: // Called once