2012-03-10 69 views
1

我正在編寫一個使用核心數據的應用程序,但通過HTTP將其數據與服務器同步。我正在監視NSManagedObjectContext的通知,以便我可以響應數據中的更改。如何識別來自特定NSManagedObjectContext保存操作的通知?

更新基於最初的反應:感謝您的建議。似乎我需要更好地解釋:我在應用程序中使用Core Data,但也將更改發佈到服務器,並監視來自受管對象上下文的通知以執行此操作。

與此同時,我還定期輪詢服務器的更改。當服務器發生變化時,我相應地更新Core Data對象。但在這種情況下,我只想避免將新更改的本地數據發送回服務器(因爲這是來自哪裏的原因)只有。換言之,當我收到我想要識別並忽略的通知時,我想要抑制保存操作上的通知。

我目前沒有對併發或線程做任何事情。如果這意味着我可以依靠託管對象上下文的保存通知以與保存操作完全相同的順序進入,那麼可以在保存之前簡單地設置一個標記。這會工作嗎?如果我想要在將來異步工作,仍然感覺混亂,如果有辦法將通知綁定到特定的保存操作或完全禁止保存通知,那將會更好。 )

+0

看看我的新的答案。 – spudwaffle 2012-03-10 17:36:21

回答

1

這是一個非常有趣的問題!

我會說,如果你不使用多線程使用BOOL標誌。

如果您正在使用多線程和目標10.6以上,你應該把你所有的核心數據業務(包括設置該標誌)上是相同的,同時大中央調度(或GCD)串行隊列。使用

dispatch_queue_t dataQueue = dispatch_queue_create("Data Queue", DISPATCH_QUEUE_SERIAL); 

您就可以執行該隊列核心數據操作:

你可以設置一個隊列,像這樣

dispatch_async(dataQueue, ^{ 
    //do work here 
}); 

不要忘記釋放隊列,當你」重新做它:

dispatch_release(dataQueue); 

dataQueue也許可以用作法醫或作爲一個gl通過一些+方法訪問的obal變量。

發送到隊列中的所有操作都將被串行執行(按順序他們提交的),所以如果一切都被髮送到同一個隊列,你應該沒有線程安全問題。

Concurrency Programming Guide閱讀上大中央調度(我個人認爲是一個非常酷的API)。

0

由於spudwaffle說您可以從通知對象中的對象指針獲取上下文。

您的合併回調方法可能是這樣的:

- (void)mergeChanges:(NSNotification *)notification { 
    if (notification.object != self.context) { 
     [self.context mergeChangesFromContextDidSaveNotification:notification]; 
    } 
} 
+0

感謝您的建議。聽起來就像我需要更清晰的問題...更新上面。 – 2012-03-10 16:29:07

相關問題