2015-04-30 3 views
1

Я использую ObjectMapper (https://github.com/Hearst-DD/ObjectMapper) и Realm в моем проекте. Мои объекты - все RLMObjects;Получение дочерних RLMObjects из трансформатора с использованием ObjectMapper

У меня есть, например, в блог объект, который содержит вложения:

dynamic var attachments = RLMArray(objectClassName: Attachment.className()) 

У меня есть пользовательский трансформатор, который начинается так:

func transformFromJSON(value: AnyObject?) -> RLMArray? { 
      let attachments = RLMArray(objectClassName: Attachment.className()) 
      if let str = value as? String { 

Я не могу понять, как я мог бы преобразовать их в RLMArray, я всегда получаю нуль в своем трансформаторе.

"attachments" : [ 
    { 
     "id" : 2, 
     "file_name" : "img1.jpg", 
     "url" : "uploads\/img.jpg" 
    }, 
    { 
     "id" : 3, 
     "file_name" : "img1.jpg", 
     "url" : "uploads\/img.jpg" 
    }, 
    { 
     "id" : 4, 
     "file_name" : "img1.jpg", 
     "url" : "uploads\/img.jpg" 
    } 
    ], 

Я считаю, что это трудно, чтобы обернуть мою голову вокруг кода, и я «не найти большую помощь в отладчик Xcode.

TL; DR Мой трансформатор получает нуль, или я ожидаю неправильного типа, как преобразовать значение в RLMArray.

Обновление: Надеюсь, что становится ясно, с чем я борюсь. Во всяком случае я изменил свой трансформатор, чтобы содержать это ради отладки:

func transformFromJSON(value: AnyObject?) -> RLMArray? { 
     let attachments = RLMArray(objectClassName: Attachment.className()) 
     if let val:AnyObject = value { 
     Debug.log("the val is this \(val)") 
     Debug.log("the val is this \(val as? String)") 
     Debug.log("the val is this \(val as? Attachment)") 
     Debug.log("the val is this \(val as? Array<Attachment>)") 
     Debug.log("the val is this \(val as? Array<String>)") 
     Debug.log("the val is this \(val as? Dictionary<String, AnyObject>)") 
     Debug.log("the val is this \(val as? Dictionary<String, String>)") 

     let mir = reflect(value) 
     Debug.log("the mirror is this \(mir)") 


     } 
     return attachments 
    } 

Еще более запутанной, первый debug.log (который только делает NSLog). выводит следующее:

the val is this (
     { 
     "file_name" = "img.jpg"; 
     id = 2; 
     url = "uploads/img.jpg"; 
    }, 
     { 
     "file_name" = "img2.jpg"; 
     id = 3; 
     url = "uploads/img2.jpg"; 
    }, 
     { 
     "file_name" = "img3.jpg"; 
     id = 4; 
     url = "uploads/img3.jpg"; 
    } 
) 

Что ни JSON, ни массив, ни словарь, насколько я могу видеть, вызвать эти строки журнала возврат:

Валь это ноль или, массив валь это дополнительно ([])

обновление это было, кажется, кортеж, так что теперь у меня есть это:

func transformFromJSON(value: AnyObject?) -> RLMArray? { 
    let attachments = RLMArray(objectClassName: Attachment.className()) 
     if let val:AnyObject = value { 
      Debug.log("-- new obj --") 

     if let arr = value as? Array<(AnyObject)> { 
      for file_name in arr { 
       Debug.log("fn: \(file_name)") 
      } 
     } 

Это позволяет мне перебирать различные вложения, теперь мне все же нужно выяснить, что такое внутренний объект.

обновление После получения массива кортежа с «AnyObject», кажется, ценность была __NSCFDictionary, которую я мог бы получать значение от использования objectForKey

+0

Что именно ваш вопрос здесь? Вы говорите, что вам трудно отлаживать, но вы не упомянули никаких ошибок. – ravron

+0

Я тоже не понимаю, о чем вы просите.Можете ли вы уточнить, почему вы испытываете трудности с отладкой? – jpsim

+0

Я предполагаю, что это специфично для пакета ObjectMapper, трансформатор расширяет трансформатор от objectmapper. Я ожидаю строку, которую я мог бы преобразовать в массив JSON и создать RLMArray, но я все равно получаю нулевое значение в своем трансформаторе. Это имеет смысл? –

ответ

1

Так что, как представляется, решение, как преобразовать массив детей в мое приложение RLMObject. Мне хотелось бы получить некоторые отзывы о том, как я ошибаюсь, и что было бы более правильным решением, так как я чувствую себя плохо для этого:

/// Трансформатор, преобразующий массив привязок api в RLMArray с вложениями ///Примечание: Назад к JSON не будет реализован в это время класса ApiAttachmentsTransform: TransformType { typealias Object = RLMArray typealias JSON = Строка

func transformFromJSON(value: AnyObject?) -> RLMArray? { 
     let attachments = RLMArray(objectClassName: Attachment.className()) 
     if let val:AnyObject = value { 
      if let arr = value as? Array<(AnyObject)> { 
       for obj in arr { 
        let attachment = Attachment() 
        if let url = obj.valueForKey("url") as? String { 
         if let id = obj.valueForKey("id") as? Int { 
          attachment.url = url 
          attachment.id = id 
          attachments.addObject(attachment) 
         } 
        } 
       } 
      } 
     } 
     return attachments 
    } 

    func transformToJSON(value: RLMArray?) -> String? { 
     return nil 
    } 
} 
Смежные вопросы