在任何人复制之前,我在 SO 和其他网站上都有所有 RxDatasource 标签的场景。但是没有人为我工作。
所以我的问题与我为我的案例所遵循的这个问题完全相关。但我也不知道这里发生了什么。它已经挣扎了两个星期。我也检查了 gitHub 代码示例,但无法理解。我已经使用 MVVM 架构模式创建了一个应用程序,一切RxSwift
正常,但现在我需要在我的视图中创建两个部分,用于我阅读并尝试应用它,但我根本没有得到它实际上在做什么. 我尝试创建其他学习项目,但那些也没有奏效。我仍然尝试编写此代码,但它给了我错误。Realm
UICollectioView
RxdataSource
我所做的是来自上面提供的链接在下面的代码中。我也不知道如何在拆分一个数组后为我的数据源提供数据或列表。下面是我的整个代码。
我不知道这个块在做什么。
//Changed
struct SectionViewModel {
var header: String!
var items: [StudentModel]
}
extension SectionViewModel: SectionModelType {
typealias Item = StudentModel
init(original: SectionViewModel, items: [StudentModel]) {
self = original
self.items = items
}
}
那么我的 CollectionView 类就像
class StudentCV: UIViewController, UICollectionViewDelegateFlowLayout {
//MARK: - Outlets
@IBOutlet weak var studentsView: UICollectionView!
let studentCells = BehaviorRelay<[StudentModel]>(value: [])
var notificationToken: NotificationToken? = nil
private let disposeBag = DisposeBag()
override func viewDidLoad() {
super.viewDidLoad()
let flowLayout = UICollectionViewFlowLayout()
let size = CGSize(width: 105, height: 135)
flowLayout.itemSize = size
studentsView.setCollectionViewLayout(flowLayout, animated: true)
studentsView.rx.setDelegate(self).disposed(by: disposeBag)
setupBinding()
}
func studentLeft(value: Int, id: Int) {
SignalRService.sharedClass.chatHub.invoke(method: "StudentLeft", withArgs: [id, value]){ (result, error) in
if let e = error {
print("Error: \(e)")
} else {
print("Done!")
let vale = Database.singleton.updatePickupStatus(studentId: id, pickupValue: value)
TestDebug.debugInfo(fileName: "", message: "STUDENT LEFTTT:: \(vale)")
if let r = result {
print("Result: \(r)")
}
}
}
}
deinit {
notificationToken?.invalidate()
}
func setupBinding() {
studentsView.register(UINib(nibName: "StudentCVCell", bundle: nil), forCellWithReuseIdentifier: "studentCV")
//Cell creation Changed here..............................
dataSource.configureCell = { (ds, cv, ip, item) in
let cell = cv.dequeueReusableCell(withReuseIdentifier: "studentCV", for: ip) as! StudentCVCell
cell.viewModel = item
return cell
}
studentCells
.asObservable()
.debug("STudent View: ")
.map({ SectionViewModel(header: "Pickups Arrived", items: $0 ) })
.bind(to: studentsView.rx.items(dataSource: dataSource)) // now here it is giving me this error (Instance method 'items(dataSource:)' requires the types '[SectionViewModel]' and 'SectionViewModel' be equivalent)
.disposed(by: disposeBag)
// item selection with model details.
Observable
.zip(
studentsView
.rx
.itemSelected,
studentsView
.rx
.modelSelected(StudentModel.self))
.bind { [weak self] indexPath, model in
let cell = self?.studentsView.cellForItem(at: indexPath) as? StudentCVCell
if (model.pickupStatus == 2) {
// updating view accordingly
}
}.disposed(by: disposeBag)
}
和 ViewModels 看起来像这样。从我居住的地方。
class StudentCollectionViewViewModel {
//MARK: Outlets
let disposeBag = DisposeBag()
var notificationToken : NotificationToken? = nil
let studentCells = BehaviorRelay<[StudentModel]>(value: [])
var studentCell : Observable<[StudentModel]> {
return studentCells.asObservable()
}
deinit {
notificationToken?.invalidate()
}
func getStudentsData(id: Int) {
let studentsData = Database.singleton.fetchStudents(byCLassId: id)
self.notificationToken = studentsData.observe{[weak self] change in
TestDebug.debugInfo(fileName: "", message: "Switch:::: change")
switch change {
case .initial(let initial):
TestDebug.debugInfo(fileName: "", message: "INIT: \(initial)")
self!.studentCells.accept(Array(studentsData))
case .update(_, let deletions, let insertions, let modifications):
TestDebug.debugInfo(fileName: "", message: "MODIF::: \(modifications)")
self!.studentCells.accept(Array(studentsData))
case .error(let error):
print(error)
}
}
}
}
我正在从数据库中填充数据,但我需要制作两个列表,我也没有得到我必须发送两个数据列表来填充的地方。另外,当我尝试在我的代码中使用它来查看事情是如何工作的但它给出了我的以下错误。 实例方法 'items(dataSource:)' 要求类型 '[SectionModel]' 和 '[StudentModel]' 是等价的。任何建议或帮助将不胜感激。提前致谢