9

Realm オブジェクト モデルには、"Event" というオブジェクトがあります。各イベントには、EventLocats のリストがあります。これらのオブジェクトを json からマップしようとしていますが、EventLocations のリストは常に空です。オブジェクトは次のようになります (わかりやすくするために簡略化しています)。

class Event: Object, Mappable {
    override class func primaryKey() -> String? {
        return "id"
    }

    dynamic var id = "" 
    var eventLocations:List<EventLocation> = List<EventLocation>()

    func mapping(map: Map) {
        id <- map["id"]
        eventLocations <- map["eventLocations"]
    }
}

class EventLocation: Object, Mappable {
    override class func primaryKey() -> String? {
        return "id"
    }

    dynamic var id: String = ""
    dynamic var name: String = ""

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

    func mapping(map: Map) {
        id <- map["id"]
        name <- map["name"]
    }
}

私が持っているjsonは、Eventオブジェクトの配列です。これは Alamofire 応答からのもので、次のようにマッピングします。

var events = Mapper<Event>().mapArray(json!)

json は次のようになります。

[
  {
    "id" : "21dedd6d",
    "eventLocations" : [
      {
        "name" : "hh",
        "id" : "e18df48a",
       },
      {
        "name" : "tt",
        "fileId" : "be6116e",
      }
    ]
  },
  {
    "id" : "e694c885",
    "eventLocations" : [
      {
        "name" : "hh",
        "id" : "e18df48a",
       },
      {
        "name" : "tt",
        "fileId" : "be6116e",
      }
    ]
  }
 ]

Mappable プロトコルを使用してカスタム オブジェクトのリストをマップする方法を知っている人はいますか? 「eventLocations」リストが常に空なのはなぜですか?

4

3 に答える 3

11

ObjectMapper の GitHub リポジトリの問題ページの 1 つを見ると、RealmListオブジェクトがまだ適切にサポートされていないようです。

その問題には、当分の間機能させるための潜在的な回避策もリストされています。これをここに反映します。

class MyObject: Object, Mappable {
    let tags = List<Tag>()

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

    func mapping(map: Map) {
        var tags: [Tag]?
        tags <- map["tags"]
        if let tags = tags {
            for tag in tags {
                self.tags.append(tag)
            }
        }
    }
}
于 2016-07-01T02:51:56.463 に答える
4

このための演算子を追加できます。

スウィフト 3 の実装:

import Foundation
import RealmSwift
import ObjectMapper

infix operator <-

/// Object of Realm's List type
public func <- <T: Mappable>(left: List<T>, right: Map) {
    var array: [T]?

    if right.mappingType == .toJSON {
        array = Array(left)
    }

    array <- right

    if right.mappingType == .fromJSON {
        if let theArray = array {
            left.append(objectsIn: theArray)
        }
    }
}

これで、追加のコードや変換は必要ありません。

list <- map["name"]

あらすじを作成しました。https://gist.github.com/danilValeev/ef29630b61eed510ca135034c444a98aを確認してください

于 2016-09-28T11:20:52.143 に答える
4

もう 1 つの解決策は、ObjectMapper のカスタム変換を実装することです。ここで実装を見つけることができます。

次に、コードで:

eventLocations <- (map["eventLocations"], ListTransform<EventLocation>())
于 2016-07-21T08:21:49.500 に答える