2016-05-16 3 views
3

Я новичок в RxSwift. В моем коде происходит что-то странное. У меня есть представление коллекции иRxSwift: код работает только в первый раз

Driver [ "Строка"]

данных для связывания.

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

Он работает в вашем первом случае использования, потому что вы на самом деле с помощью возвращаемый Driver<[String]> через bindTo():

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

Однако в вашем втором случае использования, вы ничего с возвращаемым 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 не вызывает. Он швывает, что обратный вызов flatmap не работает, и из-за этого вызов не вызван –

+0

Что вы подразумеваете под «вторым временем», ? Вы показали два разных использования ваших 'fetchImages'. Вы имеете в виду, что вы используете оба, и второй способ не работает, если он приходит позже? Или вы имеете в виду, что используете только последний вариант использования, и он работает, но только один раз? – solidcell

+0

Я использую оба: сначала я вызываю функцию с цветами и возвращаемыми данными, второй раз я использую текст из строки поиска, и он ничего не возвращает. –

Смежные вопросы