Swift 如何将ViewModel绑定到Collationview?
我正在尝试将视图模型绑定到集合视图。但我不知道怎么做。我使用的是MVVM模式和RxSwift,以前我只尝试过表视图绑定。这是我的视图模型和迄今为止完成的视图控制器代码Swift 如何将ViewModel绑定到Collationview?,swift,uicollectionview,rx-swift,Swift,Uicollectionview,Rx Swift,我正在尝试将视图模型绑定到集合视图。但我不知道怎么做。我使用的是MVVM模式和RxSwift,以前我只尝试过表视图绑定。这是我的视图模型和迄今为止完成的视图控制器代码 class SearchViewModel: ViewModelType { private let disposeBag = DisposeBag() struct input { let loadData: Signal<Void> } struct output
class SearchViewModel: ViewModelType {
private let disposeBag = DisposeBag()
struct input {
let loadData: Signal<Void>
}
struct output {
let result: Signal<String>
let loadApplyList: PublishRelay<friends>
}
func transform(_ input: input) -> output {
let api = SearchAPI()
let result = PublishSubject<String>()
let loadApplyList = PublishRelay<friends>()
input.loadData.asObservable().subscribe(onNext: { [weak self] in
guard let self = self else { return }
api.getFriend().subscribe(onNext: { (response, statuscode) in
switch statuscode {
case .ok:
if let response = response {
loadApplyList.accept(response)
}
default:
print("default")
}
}).disposed(by: self.disposeBag)
}).disposed(by: disposeBag)
return output(result: result.asSignal(onErrorJustReturn: ""), loadApplyList: loadApplyList)
}
}
这是我的ViewController代码。集合视图应如何绑定?以下是视图模型的外观:
class SearchViewModel {
// no need for a disposedBag. If you are putting a disposeBag in your view model, you are likely doing something wrong.
struct input {
let loadData: Signal<Void>
}
struct output {
let loadApplyList: Driver<[User]> // you should be passing an array here, not an object.
}
func transform(_ input: input) -> output {
let api = SearchAPI()
let friendResult = input.loadData
.flatMapLatest {
api.getFriend()
.compactMap { $0.0.map(Result<friends, Error>.success) }
.asDriver(onErrorRecover: { Driver.just(Result<friends, Error>.failure($0)) })
}
let loadApplyList = friendResult
.compactMap { (result) -> [User]? in
guard case let .success(list) = result else { return nil }
return list.friends
}
return output(loadApplyList: loadApplyList)
}
}
您是否打算使用
RxDataSource
?或者简单地在您的WIN上实现集合视图委托,并根据loadApplyList
value为这些委托返回值?集合视图需要一个项目数组。此朋友
类型中是否有数组?我们需要更多关于这种类型的详细信息。在朋友数组中,email、name和image是字符串值。@earth代码中没有数组。“朋友阵列”在哪里?@DanielT。有一个名为friendModel的文件,因为它使用了mvvm模式。此文件中有一组朋友。
class SearchViewModel {
// no need for a disposedBag. If you are putting a disposeBag in your view model, you are likely doing something wrong.
struct input {
let loadData: Signal<Void>
}
struct output {
let loadApplyList: Driver<[User]> // you should be passing an array here, not an object.
}
func transform(_ input: input) -> output {
let api = SearchAPI()
let friendResult = input.loadData
.flatMapLatest {
api.getFriend()
.compactMap { $0.0.map(Result<friends, Error>.success) }
.asDriver(onErrorRecover: { Driver.just(Result<friends, Error>.failure($0)) })
}
let loadApplyList = friendResult
.compactMap { (result) -> [User]? in
guard case let .success(list) = result else { return nil }
return list.friends
}
return output(loadApplyList: loadApplyList)
}
}
func bindViewModel() {
let input = SearchViewModel.input(loadData: loadData.asSignal(onErrorJustReturn: ()))
let output = viewModel.transform(input)
output.loadApplyList
.drive(collectionView.rx.items(cellIdentifier: "Cell", cellType: MyCellType.self)) { index, item, cell in
// configure cell with item here
}
.disposed(by: disposeBag)
}