2016-06-09 12 views
2

Swift에서 JSON을 파싱하는 방법을 배우고 있습니다. 안드로이드/자바에서오고 있으며 John Sundell의 Unbox를 사용하여 GSON을 생각 나게합니다. 참조 : Unbox podRealm & Unbox 플레이하기 좋은

데이터를 로컬로 저장하기 위해 데이터베이스로 렐름을 사용합니다. 참조 : Realm.io

JSON으로 클래스를 구문 분석하여 Realm에 저장하는 워크 플로를 찾는 것이 좋습니다. Unboxable을 구현하는 구조체와 Object (Realm)를 구현하는 클래스를 갖고 싶지 않습니다. 왜냐하면이 두 가지를 반영해야하기 때문입니다. 그건 내 현재 프로젝트에 너무 많은 일이 아니지만 다소 추한 것입니다 ...

비슷한 워크 플로우를 시도해 본 사람이 있습니까?

답변

1

두 가지 유형이 필요하다고 생각하지 않습니다. 제 제안은 Realm의 Object 클래스에서 상속받은 Swift 클래스로 객체를 만든 다음 Unbox에서 제공하는 Unboxable 프로토콜을 준수하는 것입니다. Unbox의 페이지에있는 예제에서는 구조체 모델을 사용하지만 코드 나 문서에는 클래스가 작동하지 않음을 나타내는 내용이 없습니다.

영역 모델 객체는 다른 클래스와 마찬가지로 작동합니다. 데이터베이스에 저장하려는 객체, 메소드 및 초기화 프로그램을 정의 할 수 있으며 영역을 무시하도록 할 속성을 지정할 수도 있습니다. 이렇게하면 영역 모델 역할을하는 객체와 Unbox와 호환되는 JSON 모델을 모두 만들 수 있습니다.

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

나를 위해 완벽하게 작동 예입니다
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") 
    } 
} 
다음