2016-05-16 19 views
3

Ich bin neu in RxSwift. In meinem Code passiert etwas seltsames. Ich habe eine Sammlung Ansicht undRxSwift: Code funktioniert nur beim ersten Mal

Driver [ "String"]

Daten für die Bindung.

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

Funktion gibt Daten

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 
    } 

Merkwürdig ist dies. Zum ersten Mal, als ich mit „Blume“ hole es funktioniert und Daten zurück, aber wenn ich diesen Code hinzufügen

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

Es funktioniert nicht. Es führt keine Schritte im Flatmap-Callback durch und gibt daher nichts zurück.

Antwort

4

Es funktioniert in Ihrem ersten Anwendungsfall, weil Sie tatsächlich die zurück Driver<[String]> über eine bindTo() mit:

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

jedoch in Ihrem zweiten Anwendungsfall werden Sie nichts zu tun mit dem zurück Driver<[String]> anders als das Speichern in einer Variablen, mit der Sie nichts machen.

items = self.fetchImages(text) 

A Driver tut nichts, bis Sie subscribe ihm (oder in Ihrem Fall bindTo).

EDIT: Um dies deutlicher zu machen, ist hier, wie Sie Ihren zweiter Anwendungsfall bekommen könnten zu arbeiten (ich habe vermieden, die Umsetzung Reinigung, um es einfach zu halten):

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

Ja, ich mit ihm einverstanden ist, aber das Problem ist, zweites Mal self.fetchImages (Text) gibt nichts zurück, das RxAlamofire .requestJSON nicht aufrufen.Es scheint, dass Flatmap-Callback nicht Schritte und deshalb nennt der Anruf nicht –

+0

Was meinst du mit "zweiten Mal" ? Sie haben zwei verschiedene Verwendungen Ihrer 'fetchImages' angezeigt. Meinst du, du verwendest beide, und der zweite Weg funktioniert nicht, wenn es später kommt? Oder meinst du, dass du nur den letzten Anwendungsfall verwendest und es funktioniert, aber nur einmal? – solidcell

+0

Ich benutze beide, zuerst rufe ich Funktion mit "Blumen" und seine Rückgabedaten, zweites Mal benutze ich Text von Suchleiste und es gibt nichts zurück. –

Verwandte Themen