2016-05-16 6 views
3

RxSwiftで新しくなった。私のコードでは、奇妙なことが起こります。 は、私は結合のためのコレクションビューとRxSwift:初めてのコード作業

ドライバー[ "文字列"]

データを持っています。

var items = fetchImages("flower") 
items.asObservable().bindTo(self.collView.rx_itemsWithCellIdentifier("cell", cellType: ImageViewCell.self)) { (row, element, cell) in 
      cell.imageView.setURL(NSURL(string: element), placeholderImage: UIImage(named: ""))   
}.addDisposableTo(self.disposeBag) 

fetchImages

機能

private func fetchImages(string:String) -> Driver<[String]> { 

     let searchData = Observable.just(string) 
     return searchData.observeOn(ConcurrentDispatchQueueScheduler(globalConcurrentQueueQOS: .Background)) 
      .flatMap 
      { text in // .Background thread, network request 

       return RxAlamofire 
        .requestJSON(.GET, "https://pixabay.com/api/?key=2557096-723b632d4f027a1a50018f846&q=\(text)&image_type=photo") 
        .debug() 
        .catchError { error in 
         print("aaaa") 
         return Observable.never() 
       } 
      } 
      .map { (response, json) -> [String] in // again back to .Background, map objects 
       var arr = [String]() 
       for i in 0 ..< json["hits"]!!.count { 
        arr.append(json["hits"]!![i]["previewURL"]!! as! String) 
       } 

       return arr 
      } 
      .observeOn(MainScheduler.instance) // switch to MainScheduler, UI updates 
      .doOnError({ (type) in 
       print(type) 
      }) 
      .asDriver(onErrorJustReturn: []) // This also makes sure that we are on MainScheduler 
    } 

奇妙なことは、このされたデータを返します。初めて "花"で取り込んでデータを返すが、このコードを追加すると

self.searchBar.rx_text.subscribeNext { text in 
     items = self.fetchImages(text) 
}.addDisposableTo(self.disposeBag) 

これはうまくいかない。これはフラットマップコールバックでは実行されません。そのため、何も返されません。

答えて

4

あなたが実際にbindTo()を介して返さDriver<[String]>を使用しているので、それはあなたの最初の使用の場合に動作します:

var items = fetchImages("flower") 
items.asObservable().bindTo(... 

しかし、2番目のユースケースでは、あなたが返さDriver<[String]>で何もしていません変数に保存する以外は何もしません。

items = self.fetchImages(text) 

Driverあなたまでそれにsubscribe(またはあなたのケースbindToで)何もしません。

EDIT:これをより明確にするために、ここでは(私はそれをシンプルに保つために、実装を掃除避けてきました)あなたは第二のユースケースは、仕事を得ることができる方法です:

self.searchBar.rx_text 
.flatMap { searchText in 
    return self.fetchImages(searchText) 
} 
.bindTo(self.collView.rx_itemsWithCellIdentifier("cell", cellType: ImageViewCell.self)) { (row, element, cell) in 
    cell.imageView.setURL(NSURL(string: element), placeholderImage: UIImage(named: ""))   
}.addDisposableTo(self.disposeBag) 
+0

いや、私はそれに同意し、しかし問題は、self.fetchImages(テキスト)が何も返さないということです.RxAlamofire .requestJSONは呼び出しません。フラットマップコールバックはステップインしていないので、コールされませんでした。 –

+0

"2回目" ?あなたは 'fetchImages'の2つの異なる使い方を示しました。あなたは両方を使用しているということを意味しますか?後で来れば2番目の方法は機能しませんか?または、最後のユースケースのみを使用していて、動作しますが、一度だけ使用しているということですか? – solidcell

+0

私は両方とも、私は "花"とその戻り値のデータを使用して関数を呼び出す、私は検索バーからテキストを使用し、それは何も返しません。 –

関連する問題