2016-06-23 15 views
2

通常のSwiftクラスでObjectMapperを使用すると、JSONオブジェクトを作成できますが、Realmクラスモデルで使用するとプログラムがクラッシュします。私はそれを回避しようとしました(objectが存在するかどうかをチェックし、次にprimaryKeyメソッドをオーバーライドして使用しますが、助けにはなりませんでした)。私はStackOverFlowからクラスListTransformを使用し、それは正常に動作するようです。 Xcodeは、異常終了に関する特定の情報を提供しないため、より多くのデバッグを行うことができます。他のstackoverflowのポストは役に立たない。SwiftのRealmでObjectMapperを使用中にプログラムがクラッシュする

  class UserResponse: Object, Mappable { 

       // MARK: Properties 
       // 
       var item = List<Item>() 
       dynamic var itemPurchaseDate = NSDate() 

       required convenience init?(_ map: Map) { 
        self.init() 
       } 

       func mapping(map: Map) { 
        item <- (map["item"], ListTransform<Item>()) 
        itemPurchaseDate <- (map["itemPurchaseDate"], ISO8601DateTransform()) 
       } 
      } 

      class ListTransform<T:RealmSwift.Object where T:Mappable> : TransformType { 
       typealias Object = List<T> 
       typealias JSON = [AnyObject] 

       let mapper = Mapper<T>() 

       func transformFromJSON(value: AnyObject?) -> Object? { 
        let results = List<T>() 
        if let value = value as? [AnyObject] { 
         for json in value { 
          if let obj = mapper.map(json) { 
           results.append(obj) 
          } 
         } 
        } 
        return results 
       } 

       func transformToJSON(value: Object?) -> JSON? { 
        var results = [AnyObject]() 
        if let value = value { 
         for obj in value { 
          let json = mapper.toJSON(obj) 
          results.append(json) 
         } 
        } 
        return results 
       } 
      } 

      class Item: Object, Mappable { 

       // MARK: Properties 
       // 
       dynamic var itemName = "" 

       required convenience init?(_ map: Map) { 
        self.init() 
       } 

       // Mapping between ObjectMapper (JSON) and the model properties 
       // 
       func mapping(map: Map) { 
        itemName <- map["itemName"] 
       } 
      } 

     class RealmManager { 

      // returns a dictionary which represents give mappable object 
      // 
      func jsonFormat<N: Mappable>(object: N) -> [String: AnyObject] { 
       return Mapper().toJSON(object) 
      } 

      func uploadDataToBackend(someObject: UserResponse) { 
       let postData = jsonFormat(someObject) 
       print(postData) 
     } 
    } 

    ----------------------------------------- 

    Program crash on following lines: 
    1. In Item class, program crash on line   itemName <- map["itemName"] 
    2. If I comment above line , then I get crash on itemPurchaseDate <- (map["itemPurchaseDate "], ISO8601DateTransform()) 

は、アイテムが何かを持っているdoes'tとき、最初の行は実行が、それはデータを持っているとき、それだけでクラッシュし、ことに注意してください。 詳細情報が必要な場合は、

答えて

1

ObjectMapperを使用してRealmモデルをJSONにシリアル化する際に、書き込みトランザクション内で行う必要があります。またはinit(value:)を使用してレルムからオブジェクトを切り離します。 ObjectMapperは、直列化してもモデルのプロパティに値を割り当てるためです。同じ値を割り当てても変更されませんが、Realmではトランザクションなしで値を割り当てることはできません。

注:ObjectMappersのtoJSON関数を使用してレルムオブジェクトのJSON文字列を生成する機能は、レルム書き込みトランザクション内でのみ機能します。これは、ObjectMapperがマッピング関数(<-)にinoutフラグを使用しており、シリアライズとデシリアライズの両方で使用されるために発生します。オブジェクトが変更されていなくても、レルムはフラグを検出し、書き込みブロック内で関数toJSONを強制的に呼び出すよう強制します。

ObjectMapperのドキュメントのObjectMapper + Realmセクションも参照してください。

https://github.com/Hearst-DD/ObjectMapper#objectmapper--realm

+0

Worked。どうもありがとうございます。 – Naren

関連する問題