Bir iOS uygulaması için ilk RxSwift projemi başlatıyorum ve reaktif programlama hakkında bilgi edinin.Sayfalandırılmış API Çağrılar RxSwift ile
Şimdiye kadar, bu fikir oldukça basittir, kullanıcı arama çubuğu metniyle eşleşen filmleri arar, bu da sonuçlarla birlikte bir UITableView'ı dolduran bir istek başlatır. Çevrimiçi bulduğunuz öğreticiler ve örnekler kullanarak bu bit'i çok fazla sorun yaşamadan gerçekleştirmeyi başardım.
Zor olan bölüm, tablo görüntüsünün altını kaydırarak tetiklenen sonuçların bir sonraki sayfasını yüklemeye çalıştığımda gelir. gözlemlenebilir pages
HomeViewController
benim tablo görünümü binded edilir ve arama çubuğu metni searchText
binded edilir:
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)
}
}
Bugüne kadar ne var: Burada
şimdiye kadar kullanılan koddur.Sahnelerin arkasındaki API çağrılarını gerçekleştirmek için Alamofire kullanıyorum ve TMDbAPI.Films(withTitle: query)
, Göz attıran bir liste döndürüyor.
İşte benim model yapısı 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]
}
}
Şimdi bir sonraki sayfa için bir istek tetikleyecek bir şekilde sayfalara ayrılmış listelerin gözlemlenebilir benim loadNextPage
değişken kanca reaktif bir yol arıyorum olduğunu. Ve arama çubuğu metni 0.
için sayfalama sıfırlamak istiyorum değiştiğinde ben operatörleri scan
ve concat
kullanılması gerekli ama hala emin değilim olacağını düşünüyoruz ...
herhangi bir öneriniz ... Bu çok takdir ulaşmak için nasıl
İşte