我開始爲iOS應用程序開發我的第一個RxSwift項目,並學習反應式編程。分頁API調用RxSwift
到目前爲止,這個想法非常簡單,用戶搜索匹配搜索欄文本的電影,這會觸發一個請求,將UITableView填充到結果中。使用網上找到的教程和例子,我設法實現了這一點,沒有太多的麻煩。
當我試圖加載滾動表視圖底部觸發的結果的下一頁時,棘手的部分出現了。
這是迄今爲止使用的代碼:
public final class HomeViewModel: NSObject {
// MARK: - Properties
var searchText: Variable<String> = Variable("")
var loadNextPage: Variable<Void> = Variable()
lazy var pages: Observable<PaginatedList<Film>> = self.setupPages()
// MARK: - Reactive Setup
fileprivate func setupPages() -> Observable<PaginatedList<Film>> {
return self.searchText
.asObservable()
.debounce(0.3, scheduler: MainScheduler.instance)
.distinctUntilChanged()
.flatMapLatest { (query) -> Observable<PaginatedList<Film>> in
return TMDbAPI.Films(withTitle: query, atPage: 0)
}
.shareReplay(1)
}
}
這是我到目前爲止有:可觀察pages
被綁定到我的表視圖中HomeViewController
和搜索欄的文本被綁定到searchText
。
我正在使用Alamofire在幕後執行API調用,而TMDbAPI.Films(withTitle: query)
返回分頁列表的Observable。
這裏是我的模型結構PaginatedList
public struct PaginatedList<T> {
// MARK: - Properties
let page: Int
let totalResults: Int
let totalPages: Int
let results: [T]
// MARK: - Initializer
init(page: Int, totalResults: Int, totalPages: Int, results: [T]) {
self.page = page
self.totalResults = totalResults
self.totalPages = totalPages
self.results = results
}
// MARK: - Helper functions/properties
var count: Int { return self.results.count }
var nextPage: Int? {
let nextPage = self.page + 1
guard nextPage < self.totalPages else { return nil }
return nextPage
}
static func Empty() -> PaginatedList { return PaginatedList(page: 0, totalResults: 0, totalPages: 0, results: []) }
}
extension PaginatedList {
// MARK: - Subscript
subscript(index: Int) -> T {
return self.results[index]
}
}
現在我正在尋找勾我loadNextPage
變量來觀察的分頁列表的一種方式,它會觸發下一個頁面請求的反應方式。 而當搜索欄的文本改變它會分頁重置爲0
我相信將需要使用運營商scan
和concat
,但我仍然不知道如何...
任何建議關於如何實現這一目標,將不勝感激......