【发布时间】:2021-03-16 00:17:11
【问题描述】:
我遇到了问题。我有一个绑定到 winPinataActions PublishSubject() 的集合视图。最初,当加载collectionview 时一切正常,它显示为对象,但是当pull to refresh 操作更改publishSubject 数据时,UI 没有更新,它仍然获取PublishSubject 的旧内容。 这是我绑定 collectionView 的方法:
class WinPinatasViewController: UIViewController {
@IBOutlet weak var collectionView: UICollectionView!
private let bag = DisposeBag()
override func viewDidLoad() {
super.viewDidLoad()
configureCollectionView()
}
func configureCollectionView() {
/..../
viewModel.winPinataActions
.observeOn(MainScheduler.instance)
.bind(to: collectionView.rx.items(cellIdentifier: "winPinatasCell", cellType: WinPinatasCell.self)) {(row, item, cell) in
cell.configureCell(with: item)
}.disposed(by: bag)
viewModel.getPinataActions()
}
@objc func handleRefreshControl() {
viewModel.getPinataActions()
DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
self.collectionView.refreshControl?.endRefreshing()
}
}
}
这是我的 viewModel 类:
class WinPinatasViewModel {
let winPinataActions = PublishSubject<[WinPinatasAction]>()
func getPinataActions() {
guard let ssoId = UserDefaultsStore.ssoId() else {
return
}
NetworkEngine.shared.gamificationNetwork.getUserWinPinataActions(subject: winPinataActions, ssoID: ssoId)
}
}
还有我的 NetworkEngine getuserPinataActions 方法:
func getUserWinPinataActions(subject winPinatasActions: PublishSubject<[WinPinatasAction]>, ssoID: String) {
//...//
let actions = try decoder.decode([WinPinatasAction].self, from: jsonData)
winPinatasActions.onNext(actions)
winPinatasActions.onCompleted()
//...//
}
当拉动刷新动作完成时,handleRefreshControl() 方法被调用。此外,在调试时,我可以看到在 pullToRefresh 操作之后,在我的 NetworkEngine 方法中接收到新数据,并且调用了 .onNext() 和 onCompleted() 。但是,当我滚动浏览 collectionView 数据时,单元格项来自旧数组,而不是一个新数组。请问你能帮帮我吗?我做错了什么?
【问题讨论】:
-
您的意思是在您的视图模型和网络引擎中都有一个
winPinatasActions?尝试发布可编译的代码,我可能会提供帮助。 -
@DanielT。是的,winPinatasActions 是一个 PublishSubject() 并且当进行网络调用时 getUserWinPinataActions(subject winPinatasActions: PublishSubject, ssoID: String) 它作为参数发送并在获取我的网络调用后我使用 winPinatasActions.onNext(actions) 和 winPinatasActions.onCompleted() 发送操作。这些课程非常大,这就是我不发布整个课程的原因。但是我发布了与 collectionView、PublishSubject 和网络调用相关的所有内容。
-
不要发布整个课程。但是,如果您 do 发布的内容至少无需任何额外工作即可编译,这会有所帮助。请注意,我的答案中的代码也不是整个类,但它可以编译。
标签: swift uicollectionview rx-swift