3

通常の Swift クラスで ObjectMapper を使用すると、JSON オブジェクトを作成できますが、Realm クラス モデルで使用すると、プログラムがクラッシュします。私はそれを試してみました(オブジェクトが存在するかどうかを確認し、次にプライマリキーメソッドのオーバーライドを使用しましたが、役に立ちませんでした)。StackOverFlow の ListTransform クラスを使用しましたが、うまく機能しているようです。Xcode は、さらにデバッグできるように、異常終了に関する特定の情報を提供しません。他のスタックオーバーフローの投稿は役に立ちません。

            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())

また、Item に何もない場合は最初の行が実行されますが、データがある場合は単にクラッシュすることにも注意してください。さらに情報が必要な場合は、お知らせください

4

1 に答える 1

3

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

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

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

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

于 2016-06-23T17:13:48.220 に答える