2015-05-28 16 views
1

我想用我的Core Data數據庫同步http請求結果。例如非常基本類:iOS同步json服務器對象列表

class Category: NSManagedObject { 

    @NSManaged var id: NSNumber 
    @NSManaged var name: String 
    @NSManaged var imageUrl: String 
} 

而且我從請求得到結果這個方法:

apiManager.getRequestJsonParse(Constants.Server.BackendUrl + "categories?lang=cs", completion: { (result, error) -> Void in 

     completion(categories: [], error: error) 
    }) 

結果是字典從JSON解析。沒關係,但現在我想將字典解析到我的類中,檢查數據庫中是否存在,是否存在更新屬性以及是否將新類別添加到數據庫。我之前在應用程序中使用的方法是我有兩個類:Category和CategoryCD(類似於Core Data的CD),並且首先將JSON解析爲Category類,而不是所有類別,我檢查是否有任何CategoryCD(保存在CD中)具有相同的ID,然後更新,或添加或其他東西。

現在我想如果有更好的方法,我該怎麼做。我可以每次下載新結果時刪除我的數據庫,然後添加所有結果。這種方式的問題是,如果我爲某些我想保留的類提供某些東西。就像我下載並保存圖像一樣,我寧願在課堂和保存的圖像之間建立聯繫。

我在考慮我的舊方法,但將1個核心數據類減少2個幾乎相同的類(1個用於核心數據,1個用於解析)。但是,當我啓動這個類時,有一個問題,我必須始終在數據庫中創建權限?所以它可能很複雜。

你在用什麼?我認爲這是非常普遍的問題。你有項目列表,我希望它們可以脫機使用(包括我之前下載的所有數據),但是當我連接到互聯網時,我想用新的結果進行更新(不是從服務器全部下載,只是我請求的響應) 。

回答

1

這是一個非常普遍的問題,它已經解決了數百種方法。順便說一句,這不是「同步」它是「緩存」離線使用。

不要創建兩個對象,因爲這是多餘的。只創建核心數據對象作爲解析的一部分。

標準的JSON解析應該是這樣的:

  1. 轉換爲使用NSJSONSerializer對象。
  2. 獲取從JSON對象的所有唯一ID使用志願
  3. 獲取從核心數據基於uniqueIDs所有現有對象
  4. 插入當前不存在

如果你要更新對象的所有對象那麼#4會做兩個。

在Stackoverflow上搜索,你會發現很多如何做到這一點的例子。

1

我在我的一個應用程序中做了類似的事情。 以下是一些通用代碼,用於獲取項目並進行更新。如果它不存在,它會創建它。

func insertOrUpdateManagedObject(id: Int16, name: String) -> YourManagedObject? { 
    var managedObject: YourManagedObject? 
    if let context = self.managedObjectContext { 
    if let fetchResult = fetchManagedObjectWithId(id) { 
     managedObject = fetchResult 
     managedObject?.name = name 
    } 
    else { 
     managedPhrase = NSEntityDescription.insertNewObjectForEntityForName("YourManagedObject", inManagedObjectContext: context) as? YourManagedObject 
     managedObject?.id = id 
     managedObject?.name = name 
    } 
    } 

    println("Created a managed object \(managedObject)") 
    return managedObject 
} 
+0

該代碼的性能會很糟糕。您正在爲每個單獨的對象執行一次訪存以確定它是否存在。這是N命中到磁盤。相反,您應該使用KVO從傳入的JSON獲取所有唯一標識符,並執行** ONE **調用現有對象的磁盤。然後你可以迭代。 –

+0

@ MarcusS.Zarra哦,我知道這一點。但是,這是一個單一的條目。我敢肯定,運營商可以根據自己的需求調整代碼 – Chackle

+0

如何使用KVO來查找所有獨特的ID? – Lytic