2011-10-25 66 views
1

我正在使用MagicalRecord來幫助核心數據操作。在NSOperation子類中保存上下文時無法接收NSManagedObjectContextDidSaveNotification

我有一個NSOperation子類叫OfflineRetrieveOperation。它從服務器檢索消息並保存。 的代碼是這樣的:

NSManagedObjectContext *context = [NSManagedObjectContext contextForCurrentThread]; 
Message *existMessage = [Message MessageWithMessageID:messageID inManagedObjectContext:context]; 

if (!existMessage) { 
    Message *message = [Message insertMessageWithProperties:properties inManagedObjectContext:context]; 
} 
[context save]; 

通報接收初始化這樣的:

- (id)init 
{ 
    self = [super init]; 

    if (self != nil) { 
    [[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(contextDidSave:) 
               name:NSManagedObjectContextDidSaveNotification 
               object:[NSManagedObjectContext defaultContext]]; 
    [self setContext:[NSManagedObjectContext context]]; 
    } 
    return self; 
} 

日誌:

-[NSManagedObjectContext(MagicalRecord) saveWithErrorHandler:](0x5906a0) Saving Context 
-[NSManagedObjectContext(MagicalRecord) mergeChangesFromNotification:](0x37eab0) Merging changes to *** DEFAULT *** context *** on Main Thread *** 

一切似乎都做工精細,除了我不能接受根本不知道我已經完成檢索了。

回答

3

您的OfflineRetrieveOperation可能正在創建自己的NSManagedObjectContext。當你保存上下文時,它將觸發NSManagedObjectContextDidSaveNotification。然而,你有一個觀察員,將只有收聽廣播的NSNotification

更改您的觀察者以使用OfflineRetrieveOperation內部NSManagedObjectContext而不是[NSManagedObjectContext defaultContext]的消息通知,它應該開始接收它們。

+0

感謝U,Marcus。 我嘗試在不同線程中執行所有類型的操作,然後將更改合併到[NSManagedObjectContext defaultContext]。 – caiguo

+0

它是廣播通知的操作的'NSManagedObjectContext'。您需要將addNotification對象設置爲廣播者(或無)以接收通知。我建議你閱讀'NSNotification'和'NSNotificationCenter'是如何工作的。 –

+0

由於存在可能會改變數據的不同類型的操作,通知接收者只關心defaultContext會很方便。 我想我可以這樣做: [[OfflineRetrieveOperation context] save]; [[NSManagedObjectContext defaultContext] save]; 第二次保存wile一個NSManagedObjectContextDidSaveNotification並通知接收者將收到此。 如果[通知用戶信息]沒有內容,則使用NSFetchedResultsController執行提取並獲取最新的數據。 – caiguo

3

所以,我猜你可能想要更新defaultContext中的對象,當你將它們保存在後臺上下文中。當你使用helper方法創建一個新的上下文時,MagicalRecord實際上已經爲你處理了這種情況。也就是說,當你做這樣的事情:

NSManagedObjectContext *backgroundOperationContext = 
      [NSManagedObjectContext contextThatNotifiesDefaultContextOnMainThread]; 

上下文方法已經建立必要告訴默認情況下,當它在後臺保存合併更改的通知。您只需在後臺操作中保持上下文的活躍狀態,並在準備好保存數據時調用save。

在幕後,上下文方法是做什麼時候馬庫斯是在暗示,那就是,增加了通知通知中心:

[NSNotificationCenter defaultCenter] addObserver:[NSManagedObjectContext defaultContext]   
             selector:... 
              name:NSManagedObjectContextDidSaveNotification 
              object:backgroundOperationContext] 

這是不完全的代碼,但是這是非常它做的很多。底線,忘記擔心觀察和合並背景上下文變化到默認上下文本身,MagicalRecord會爲您負責。

+0

+1 MagicalRecord的創造者當然最有可能知道。 :) –

相關問題