2011-06-01 53 views
0

我有一個用於保存管理對象上下文和照顧的任何錯誤的一類方法的CoreDataUtilities類:此方法是否會導致併發問題?

+ (void)saveContext:(NSManagedObjectContext*)moc { 
    NSError *error = nil; 
    if (moc != nil) { 
     if ([moc hasChanges] && ![moc save:&error]) { 
      NSLog(@"MOC save error: %@, %@", error, [error userInfo]); 
     } 
    } 
} 

我打電話從的NSOperation子類和後臺線程這種方法,並傳入的的的NSManagedObjectContext實例線程/ NSOperation。

我擔心的是這樣的:

如果線程A調用這個方法,雖然這種方法在執行中途,線程B調用它。當然還有另一個MOC。這種干涉有什麼危害?從我的角度來看,它不會,因爲這種方法只會與調用線程的「私有」或「擁有」的MOC實例進行通信。但是,如果多個線程同時執行同一段代碼,即使某個方法中的局部變量也會「混淆起來」,令我感到惱火的是。還是每個變量都有自己的「上下文」在一個新的線程中,有它自己的堆(或堆棧,就此而言)的內存?

如果我把這個保存代碼直接放到NSOperation子類和後臺線程中,它會產生很大的不同嗎?爲什麼?

回答

3

爲什麼不把@synchronize(...)塊放在保存操作的周圍。這將確保如果託管對象上下文已經保存,則它不會被保存。

+ (void)saveContext:(NSManagedObjectContext*)moc { 
    if (moc == nil) return; 

    @synchronized(moc) 
    { 
     NSError *error = nil; 
     if ([moc hasChanges] && ![moc save:&error]) 
      NSLog(@"MOC save error: %@, %@", error, [error userInfo]); 
    } 
} 

閱讀here關於同步。

2

規則是每個線程都必須有自己的moc。

查看Apple's Guidelines瞭解更多信息。

+0

是的,每個線程都有自己的MOC。所以如果一個線程調用[CoreDataUtilities saveContext:myMOC]那麼會有問題嗎?問題是關於多個線程將他們自己的MOC傳遞給這個單一的保存方法。 – 2011-06-01 21:30:17

+0

如果你在每個線程上有一個moc,你不需要擔心重疊的保存調用,因爲在moc下面蘋果處理併發。在moc上進一步同步不會有任何好處,因爲它對於每個線程都是不同的對象 – 2011-06-01 22:51:49

相關問題