現在、Rxプログラミングを学習しようとしています。私はMoyaが興味をそそられていることを知り、シンプルなネットワークリクエストを実装しようとしていましたが、次にそれをオブジェクトにマッピングしてから、tableViewを作成することができます。Rxプログラミング(Moya)を使用したオブジェクトへのJSON応答のマッピング
私はこのチュートリアルを次されています: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)
}
(私がセルを設定した)バインド内のコードは決して呼び出されません。また、Train Mapperクラスの中にブレークポイントを置くと、決して呼び出されません。
であなたはポッドをアップデートしてみてくださいことはできますか?それが助けにならないなら、あなたは200の応答を得るので、要求はOKと思われます。あなたは 'trackIssues()'をUIにどのようにバインドしますか? – sunshinejr
お返事ありがとうございます。私はポッドを更新したが、うまくいかなかった。私はどこに私がUIに拘束するtrackIssues()を含めるためにコードを編集しました。 – pls
配列が "train"キーにある場合は、 '.mapArrayOptional(Train.self)'の代わりに '.mapArrayOptional(Train.self、keyPath:" train ")'を使ってみてください。 – sunshinejr