Swift 如何将ViewModel绑定到Collationview?

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

我正在尝试将视图模型绑定到集合视图。但我不知道怎么做。我使用的是MVVM模式和RxSwift,以前我只尝试过表视图绑定。这是我的视图模型和迄今为止完成的视图控制器代码

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)
}