2016-05-17 17 views
1

結果の配列に対して動的マッピングを構成する際に問題があります。マップしたい結果オブジェクトは、囲まれたオブジェクトのタイプを記述する「コンテナ」内に埋め込まれています。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)) 
+0

あなたは問題が何であるかは述べていません。私は個人的には複数の異なるエンティティを持たないだろう。 – Wain

+0

@Wain申し訳ありませんが、私は問題を非常に明確にしませんでした。私は質問を更新しましたが、簡単に言えば、私が与えたマッピングの例はうまくいきません - 最初に例外が発生し、2つ目は動的パスからアクセスできないキーパスに基づいて動的マッピングを実行しようとします。ディクショナリを動的マッピングブロックに追加します(リレーションシップマッピングの「fromKeyPath」がレベルが深すぎるため)。エンティティは、質問の明快さ/簡潔さのために単純化されている。実際にはオブジェクトは別々のエンティティであることを保証するのに十分なほど異なっています。 – Stuart

答えて

1

あなたは、管理対象オブジェクトを含む辞書の配列となるコアデータ関係を接続しているため、実行しようとしていることを正確に行うことはできません。

最も簡単な解決策は、ソースキー(パス)の先頭にitem.を追加することによって、スキップロジックをどこから取り出し、管理対象オブジェクト(タスクとリマインダ)のすべてのマッピングを作成することです。したがって

"item.title" : "title" 
+0

ありがとうございました、私がうまくいかない道を進んでいたことを知っていると助かります。私は、ディクショナリが中間データとして機能し、アイテムをコアデータにマッピングできるようになることを何とか考えていたと思います。また、オブジェクトクラスによってうまくカプセル化されているため、個々のアイテムマッピングを変更する必要がなく、 'item'プリフィックスなしでこれらのマッピングが使用されるルートがあります。私はそれを乗り越えて、マッピングを返すメソッドに 'sourceKeyPathPrefix'パラメータを追加するだけです。助けてくれてありがとう! – Stuart

+0

辞書アプローチは、リストマッピングがコアデータとは何の関係も持た​​ない場合にのみ機能します。これは、中核関係の非コアデータ) – Wain

+0

はい、意味があります。あなたの助けてくれてありがとう、私は今進行する最良の方法を知っている。 – Stuart

関連する問題