2016-04-09 4 views
1

В настоящее время я пытаюсь изучить Rx-программирование. Я нашел Moya интригующим и пытался реализовать простой сетевой запрос, который затем сопоставляется с объектами, которые затем я могу использовать для заполнения tableView.Отображение ответа JSON на объекты с использованием программирования Rx (Moya)

Я после этого учебника: http://www.thedroidsonroids.com/blog/ios/rxswift-examples-3-networking/

Я считаю, что я получаю успешный ответ, как я использую .debug и получить следующий вывод:

2016-04-09 13:29:30.398: MyApi.swift:37 (findRepository) -> subscribed 
2016-04-09 13:29:30.400: MyApi.swift:35 (findRepository) -> subscribed 
2016-04-09 13:29:32.633: MyApi.swift:35 (findRepository) -> Event Next(Status Code: 20..., Data Length: 5747) 
2016-04-09 13:29:32.633: MyApi.swift:35 (findRepository) -> Event Completed 

Вот код, который я использую :

let provider: RxMoyaProvider<MyApi> 
let repositoryName: Observable<String> 

func trackIssues() -> Observable<[Train]> { 
    return repositoryName 
     .observeOn(MainScheduler.instance) 
     .flatMapLatest { name -> Observable<[Train]?> in 
      print("Name: \(name)") 

      return self.findRepository(name) 
     }.replaceNilWith([]) 
} 

internal func findRepository(name: String) -> Observable<[Train]?> { 
    print("help") 
    return self.provider 
     .request(MyApi.Trains(name, "c76a46ce2b3d8685982b/raw/10e86080c3b1beedd46db47f5bb188cc74ce5c78/sample.json")) 
     .debug() 
     .mapArrayOptional(Train.self) 
     .debug() 
} 

А вот объект Я пытаюсь сопоставить:

import Mapper 

struct Train: Mappable { 

    let distance: String 
    let eta: String 

    init(map: Mapper) throws { 
     try distance = map.from("distance") 
     try eta = map.from("eta") 
    } 
} 

Я посмотрел на ответ сети и задаюсь вопросом, нужно ли мне сначала абстрагировать данные «поезда». Я попытался это картированием к следующему объекту с вне удачи:

import Mapper 

struct TrainsResponse: Mappable { 

    let trains: String 

    init(map: Mapper) throws { 
     try trains = map.from("trains") 
    } 
} 

Вы можете найти пример ответа JSON здесь: http://pastebin.com/Wvx8d5Lg

Так мне было интересно, если кто-нибудь может помочь мне понять, почему я не могу повернуть ответ на объекты. Благодарю.

=======

Я попытался сделать обновление стручок, и это до сих пор не работает. Вот где я буду привязывая его к Tableview:

func setupRx() { 
    // First part of the puzzle, create our Provider 
    provider = RxMoyaProvider<MyApi>() 

    // Now we will setup our model 
    myApi = MyApi(provider: provider, repositoryName: userName) 

    // And bind issues to table view 
    // Here is where the magic happens, with only one binding 
    // we have filled up about 3 table view data source methods 
    myApi 
     .trackIssues() 
     .bindTo(tableView.rx_itemsWithCellFactory) { (tableView, row, item) in 
      let cell = tableView.dequeueReusableCellWithIdentifier("issueCell", forIndexPath: NSIndexPath(forRow: row, inSection: 0)) 
      cell.textLabel?.text = "Hello" 

      print("Hello") 

      return cell 
     } 
     .addDisposableTo(disposeBag) 
} 

код внутри связываются с (где я поставил клетку) никогда не вызывается. Кроме того, если я помещаю точку останова в свой класс Map Map, который также никогда не будет вызван.

+1

Вы можете попробовать обновить стручки? Если это не помогает, запросы выглядят нормально, потому что вы получаете ответ 200. Как вы связываете «trackIssues()» с пользовательским интерфейсом? – sunshinejr

+0

Спасибо за ответ. Я сделал обновление pod, но это не сработало. Я редактировал код, чтобы включить, где я привязываю trackIssues() к пользовательскому интерфейсу. – pls

+1

Если массив находится в «поездах», попробуйте использовать '.mapArrayOptional (Train.self, keyPath:" trainins ")', вместо '.mapArrayOptional (Train.self)'. – sunshinejr

ответ

1

Причина, по которой она не работает, заключается в том, что JSON, полученный с сервера, возвращает словарь, а не массив. Массив, который вы хотели разобрать, находится под клавишей «trains» в этом словаре. Moya-ModelMapper, используемый в учебнике, также имеет методы для этого использования. Вам просто нужно передать второй аргумент, keyPath: в методе mapArrayOptional().

Таким образом, ответ на ваш вопрос заменить:
.mapArrayOptional(Train.self)
с
.mapArrayOptional(Train.self, keyPath: "trains")

+0

Привет, можете спросить, как мы можем обрабатывать вложенный json? например, данные, необходимые для модели, находятся за несколькими вложенными json в json-ответе. И может помочь мне с этим вопросом? многие благодарят http://stackoverflow.com/questions/43228253/ios-construct-moya-targettype –

Смежные вопросы