2016-06-09 82 views
2

我正在學習從Swift中解析JSON,來自Android/Java,我使用John Sundell的Unbox來幫助我,這讓我想起了GSON。 參考:Unbox podMaking Realm&Unbox play

我使用Realm作爲數據庫來本地存儲數據。 參考:Realm.io

很高興找到一個工作流來解析一個類與JSON並將其保存到領域。我不想有一個實現Unboxable的結構和一個實現Object(Realm)的類,因爲那麼我必須反映這兩個。這對我目前的項目來說並不是太多工作,但它有點難看...

你們有沒有嘗試類似的工作流程?

回答

1

我不認爲你需要兩種不同的類型。我的建議是將你的對象創建爲從Realm的Object類繼承而來的Swift類,然後使它們符合Unbox提供的Unboxable協議。 (雖然在拆箱的頁面使用結構模型的例子,有沒有什麼指示類是行不通的代碼或文檔)。

領域模型對象的工作就像任何其他類:除了在定義什麼屬性您希望存儲在數據庫中的對象,還可以定義方法和初始化程序,甚至指定您希望Realm忽略的屬性。這使您可以創建一個同時用作Realm模型和兼容Unbox的JSON模型的對象。

0

這裏是一個完美的作品對我來說一個例子:

class ProviderRealm: Object, Unboxable { 
    dynamic var identifier: String = "demo" 
    dynamic var name: String? 
    dynamic var logo: String? 

    /// Initializer used for unboxing of JSON string 
    required init(unboxer: Unboxer) throws { 

     self.identifier = (try? unboxer.unbox(key: "identifier")) ?? "demo" 
     self.name = try? unboxer.unbox(key: "name") 
     self.logo = try? unboxer.unbox(key: "logo") 

     super.init() 
    } 

    required init(realm: RLMRealm, schema: RLMObjectSchema) { 
     super.init(realm: realm, schema: schema) 
    } 

    required init() { 
     super.init() 
    } 

    required init(value: Any, schema: RLMSchema) { 
     super.init(value: value, schema: schema) 
    } 

    override static func primaryKey() -> String? { 
     return "identifier" 
    } 
} 
0

一個更簡潔的方法,不需要重寫需要initialisers(根據tweet由馬林·託多羅夫):

class Car: Object, Unboxable { 
    dynamic var vendor: String = "" 
    dynamic var modelName: String = "" 
    dynamic var electric: Bool = false 

    required convenience init(unboxer: Unboxer) throws { 
     self.init() 
     self.vendor = try unboxer.unbox(key: "vendor") 
     self.modelName = try unboxer.unbox(key: "modelName") 
     self.electric = try unboxer.unbox(key: "electric") 
    } 
}