2016-05-16 144 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) 

它不起作用。它不會在flatmap回調中進行操作,因此,不會返回任何內容。

回答

4

它可以在您第一次使用的情況下,因爲你實際上是通過bindTo()使用返回Driver<[String]>

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

然而,在你的第二個使用的情況下,你是不是做與返回Driver<[String]>什麼除了將它保存到一個變量中,你什麼也不做。

items = self.fetchImages(text) 

一個Driver什麼也不做,直到你subscribe它(或你的情況bindTo)。

編輯:爲了更清楚,這裏是你如何能得到你的第二個用例的工作(我避免清理執行,以保持它的簡單):

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 does not call.It接縫flatmap回調doesnt步驟,因爲該呼叫does not調用 –

+0

你是什麼意思的「第二次」 ?你已經展示了你的'fetchImages'的兩種不同用途。你的意思是你同時使用兩種方法,而第二種方式如果遲一點就不起作用了?或者你的意思是說你只使用最後一個用例,它確實有效,但只有一次? – solidcell

+0

我使用兩個,第一次我用「花朵」和它的返回數據調用函數,第二次我使用搜索欄中的文本,它不返回任何東西。 –