#ios #swift #rx-swift #rxdatasources
#iOS #swift #rx-swift #rxdatasources
Вопрос:
Я знаю, что по этому поводу есть много вопросов, я просмотрел их все, но это не решает мою проблему. Я также прокомментировал один из них, но вопрос, похоже, больше не активен, поэтому я не ожидаю ответа там.
Я пытаюсь реализовать RxDataSources. Смотрите мой код ниже:
struct ActiveOrdersSection: Equatable {
static func == (lhs: ActiveOrdersSection, rhs: ActiveOrdersSection) -> Bool {
return true
}
var header: String
var orders: [Order]
}
extension ActiveOrdersSection: SectionModelType {
typealias Item = Order
var items: [Item] {
set {
orders = items
}
get {
return orders
}
}
init(original: ActiveOrdersSection, items: [Order]) {
self = original
self.items = items
}
}
И ViewController:
class MainViewController: UITableViewDelegate, UITableViewDataSource {
var db: DisposeBag?
var dataSource: RxTableViewSectionedReloadDataSource<ActiveOrdersSection>?
private func setupOrderRx(_ shopId: Int64) {
let dataSource = RxTableViewSectionedReloadDataSource<ActiveOrdersSection>(
configureCell: { ds, tv, ip, item in
let cell = tv.dequeueReusableCell(withIdentifier: "Cell", for: ip) as! UITableViewCell
cell.textLabel?.text = "Item (item.id)"
return cell
},
titleForHeaderInSection: { ds, ip in
return ds.sectionModels[ip].header
}
)
self.dataSource = dataSource
db = DisposeBag()
let ors = OrderRxService.listAsShop(shopId, status: .active)
.map { Observable.just($0.items) } // Convert from Observable<CollectionResponse<Order>> to Observable<Order>
.observeOn(MainScheduler.instance)
.bind(to: self.rxTableView.rx.items(dataSource: dataSource))
}
}
Я Generic parameter 'Self' could not be inferred
включаюсь .bind(to: self.rxTableView.rx.items(dataSource: dataSource))
. Я просмотрел примеры RxDataSources, и, похоже, сейчас он такой же, но, похоже, я не могу исправить эту ошибку.
Есть идеи?
Ответ №1:
Поток Rx, который вы привязываете к своему, RxTableViewSectionedReloadDataSource
должен быть типа Observable<[ActiveOrdersSection]>
. Я не знаю точно, какие у вас типы в этом примере, потому что предоставленного вами кода недостаточно, но я думаю, что при использовании .map { Observable.just($0.items) }
результирующий поток будет иметь тип Observable<Observable<[Order]>>
. Попробуйте изменить его на: .map { [ActiveOrdersSection(header: "Your Header", orders: 0.items)] }
Комментарии:
1. Спасибо! Похоже, я не совсем понял концепцию RxDataSources. Это решило мою проблему.