2012-10-08 60 views
2

我需要用註釋填充我的地圖。每個註釋都具有相應的從遠程服務器獲取的Place資源。每個地方都有關聯的類別 - 它也是作爲單獨的資源從服務器獲取的。異步獲取許多資源並「異步」將它們保存到數據庫。哪種模式可以使用? (AFNetworking,核心數據)

我們假設要填充給定的區域,我需要獲取100個地方,每個地方都屬於20個類別中的一個(實際上有更多的地方)。

我使用AFNetworking來獲取這兩種資源。我嘗試緩存兩個地方和類別以供離線使用,因此在地圖上顯示註釋之前,我會將獲取的資源寫入核心數據表。

每個地方根據需求檢索其關聯的類別資源,我需要在「地點」表中寫入地點,並在「類別」表中寫入類別。

因爲抓取正在異步完成,所以在向表中寫入特定類別時,我無法知道另一個地方「線程」是否嘗試將相同的關聯類別寫入「類別」表。

所以,問題是:當核心數據表需要填充異步檢索的信息時,使用核心數據表的模式是什麼?具體來說,任何給定類別的線程如何知道已經有人試圖這樣做?

更新1:我目前的問題是,目前我有重複的類別。我的猜測是,顯然每個試圖編寫的類別都不知道同一類別的並行寫入。

更新2:我的情況下,最簡單的描述如下:

我在一個線程,並在另一個線程同時創建某些領域一個新的類別的實體創建完全相同的範疇實體與相同的領域目標是像第一個線程一樣的Category對象。

一個線程調用勝[managedObjectContext節省:&錯誤],但後來實際的記錄出現在PersistentStore之前,第二不叫救了。問題是:如何防止「類別」表中記錄的重複?

更新3:我正在考慮使用託管對象上下文的這兩種型號:每個線程1)所有線程2重用一個共享的MOC實例)實例化一個新的MOC

謝謝!

回答

2

「官方」的答案將是關於使用NSOperationQueue和/或採取手動步驟來確保所有對NSManagedObjectContext的訪問發生在創建上下文的相同線程上。有很多references and tutorials,你可以按照實施這種方法。

作爲一種替代方案,github上有一個thread-safe Core Data extension將爲您做到這一點。如果你使用它,它會自動同步你的數據庫操作,這樣你就不用擔心另一個線程是否正在對上下文進行操作。你可以插入一些東西,框架將確保你的操作被轉換成不會使Core Data爆炸的東西。

完全披露:我構建了github項目。

+0

感謝您的回答。在嘗試引導您的擴展之前,我將在有關管理_shared_上下文的問題中解決問題。 –