В настоящее время я пытаюсь изучить 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, который также никогда не будет вызван.
Вы можете попробовать обновить стручки? Если это не помогает, запросы выглядят нормально, потому что вы получаете ответ 200. Как вы связываете «trackIssues()» с пользовательским интерфейсом? – sunshinejr
Спасибо за ответ. Я сделал обновление pod, но это не сработало. Я редактировал код, чтобы включить, где я привязываю trackIssues() к пользовательскому интерфейсу. – pls
Если массив находится в «поездах», попробуйте использовать '.mapArrayOptional (Train.self, keyPath:" trainins ")', вместо '.mapArrayOptional (Train.self)'. – sunshinejr