結果の配列に対して動的マッピングを構成する際に問題があります。マップしたい結果オブジェクトは、囲まれたオブジェクトのタイプを記述する「コンテナ」内に埋め込まれています。RestKitネストされたアイテムを使用した動的マッピング
Iは、以下のJSONが類似有する:
"list": {
"name": ""
"item_infos": [
{
"type": "TaskItem",
"item": {
"id": 0
"title": "A Task Item",
"task": "..."
}
"url": "..."
},
{
"type": "ReminderItem",
"item": {
"id": 0
"title": "A Reminder Item",
"reminder": "..."
}
"url": "..."
}]
}
Iは、各アイテムが異なるタイプのものであるかもしれないItem
の配列とList
オブジェクト、これをマップしたいです。異なるtype
は有限であり、既知である。
class List: NSManagedObject {
@NSManaged var name: String
@NSManaged var items: NSOrderedSet
}
class Item: NSManagedObject {
@NSManaged var identifier: Int32
@NSManaged var title: String
// Each mappable `Item` is responsible for providing its own
// mapping object. It's overridden in the subclasses below.
class func responseMappingForManagedObjectStore(dos: RKManagedObjectStore) -> RKEntityMapping { ... }
}
class TaskItem: Item {
@NSManaged var task: String
}
class ReminderItem: Item {
@NSManaged var reminder: String
}
は、どのように私はまだtype
フィールドを利用しながら、RKDynamicMapping
を使用して直接リストの下に埋め込まれたitem
をマッピングすることができますか?私は、応答マッピングのために、これらの線に沿って何かをしようとしている:
let listMapping = RKEntityMapping(forEntityForName: "List", inManagedObjectStore: store)
responseMapping.addAttributeMappingsFromDictionary(["name": "title"])
let dynamicItemMapping = RKDynamicMapping()
dynamicItemMapping.setObjectMappingForRepresentationBlock { representation in
let itemMapping: RKEntityMapping
switch representation.valueForKeyPath("type") as? String {
case .Some("TaskItem"): itemMapping = TaskItem.responseMappingForManagedObjectStore(objectStore)
case .Some("ReminderItem"): itemMapping = ReminderItem.responseMappingForManagedObjectStore(objectStore)
default: return nil
// This is the bit I'm failing to solve. How can I return a mapping
// that essentially "skips" a level of the JSON, and just maps the
// embedded `item`, not the `item_info`.
let itemInfoMapping = RKObjectMapping(forClass: NSMutableDictionary.self)
itemInfoMapping.addRelationshipMappingWithSourceKeyPath("item", mapping: itemMapping)
return itemInfoMapping
}
listMapping.addPropertyMapping(RKRelationshipMapping(
fromKeyPath: "item_infos",
toKeyPath: "items",
withMapping: dynamicItemMapping))
このマッピング、例外が発生して
:動的なマッピングがある方法として、私は驚かないん
-[__NSDictionaryM _isKindOfEntity:]: unrecognized selector sent to instance 0x7fd2603cb400
とにかくちょうどいい気分にならないように設定しました。私は、JSONのレベルを「スキップ」する方法を探していて、組み込みのしかマップしていません。
別の試みは、完全listMapping
に関係するため"item_infos.item"
としてfromKeyPath
を指定することであったが、その後、私は使用するItem
マッピングのタイプを決定するために、動的マッピングブロック内type
フィールドを使用することはできません。
// ...
dynamicItemMapping.setObjectMappingForRepresentationBlock { representation in
// `type` inaccessible from the nested item representation
switch representation.valueForKeyPath("type") as? String {
case .Some("TaskItem"): return TaskItem.responseMappingForManagedObjectStore(objectStore)
case .Some("ReminderItem"): return ReminderItem.responseMappingForManagedObjectStore(objectStore)
default: return nil
}
listMapping.addPropertyMapping(RKRelationshipMapping(
fromKeyPath: "item_infos.item",
toKeyPath: "items",
withMapping: dynamicItemMapping))
あなたは問題が何であるかは述べていません。私は個人的には複数の異なるエンティティを持たないだろう。 – Wain
@Wain申し訳ありませんが、私は問題を非常に明確にしませんでした。私は質問を更新しましたが、簡単に言えば、私が与えたマッピングの例はうまくいきません - 最初に例外が発生し、2つ目は動的パスからアクセスできないキーパスに基づいて動的マッピングを実行しようとします。ディクショナリを動的マッピングブロックに追加します(リレーションシップマッピングの「fromKeyPath」がレベルが深すぎるため)。エンティティは、質問の明快さ/簡潔さのために単純化されている。実際にはオブジェクトは別々のエンティティであることを保証するのに十分なほど異なっています。 – Stuart