RxSwift:代码只在第一次运行
RxSwift: code working only first time
我是 RxSwift 的新手。我的代码中发生了一些奇怪的事情。
我有一个集合视图并且
Driver["String"]
绑定数据。
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
函数returns数据
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
}
奇怪的是。第一次使用 "flower" 获取数据时,它可以工作 return 数据,但是当我添加此代码时
self.searchBar.rx_text.subscribeNext { text in
items = self.fetchImages(text)
}.addDisposableTo(self.disposeBag)
没用。它不会介入平面图回调,因此,不会 return 任何东西。
它适用于您的第一个用例,因为您实际上是通过 bindTo()
:
使用返回的 Driver<[String]>
var items = fetchImages("flower")
items.asObservable().bindTo(...
但是,在您的第二个用例中,您没有对返回的 Driver<[String]>
做任何事情,只是将它保存到一个变量中,您什么都不做。
items = self.fetchImages(text)
A 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)
我是 RxSwift 的新手。我的代码中发生了一些奇怪的事情。 我有一个集合视图并且
Driver["String"]
绑定数据。
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
函数returns数据
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
}
奇怪的是。第一次使用 "flower" 获取数据时,它可以工作 return 数据,但是当我添加此代码时
self.searchBar.rx_text.subscribeNext { text in
items = self.fetchImages(text)
}.addDisposableTo(self.disposeBag)
没用。它不会介入平面图回调,因此,不会 return 任何东西。
它适用于您的第一个用例,因为您实际上是通过 bindTo()
:
Driver<[String]>
var items = fetchImages("flower")
items.asObservable().bindTo(...
但是,在您的第二个用例中,您没有对返回的 Driver<[String]>
做任何事情,只是将它保存到一个变量中,您什么都不做。
items = self.fetchImages(text)
A 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)