2016-04-09 11 views
1

現在、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クラスの中にブレークポイントを置くと、決して呼び出されません。

+1

であなたはポッドをアップデートしてみてくださいことはできますか?それが助けにならないなら、あなたは200の応答を得るので、要求はOKと思われます。あなたは 'trackIssues()'をUIにどのようにバインドしますか? – sunshinejr

+0

お返事ありがとうございます。私はポッドを更新したが、うまくいかなかった。私はどこに私がUIに拘束するtrackIssues()を含めるためにコードを編集しました。 – pls

+1

配列が "train"キーにある場合は、 '.mapArrayOptional(Train.self)'の代わりに '.mapArrayOptional(Train.self、keyPath:" train ")'を使ってみてください。 – sunshinejr

答えて

1

なぜ動作しないのかという理由は、サーバーから取得したJSONが配列ではなく辞書を返すためです。解析したい配列は、その辞書の "列車"キーの下にあります。チュートリアルで使用されているMoya-ModelMapperには、この使用法のためのメソッドもあります。 mapArrayOptional()メソッドでは、2番目の引数keyPath:を渡す必要があります。

だからあなたの質問に対する答えは置き換えされています
.mapArrayOptional(Train.self)

.mapArrayOptional(Train.self, keyPath: "trains")

+0

こんにちは、どうやって入れ子になったjsonを処理できますか?例えば、モデルに必要なデータは、jsonレスポンスの中にいくつか入れ子にされたjsonの後ろにあります。そして、この質問で私を助けることができますか?多くのありがとうhttp://stackoverflow.com/questions/43228253/ios-construct-moya-targettype –

関連する問題