gpt4 book ai didi

ios - 具有输入输出的 rxswift viewmodel

转载 作者:搜寻专家 更新时间:2023-11-01 06:50:52 26 4
gpt4 key购买 nike

我正在尝试在 RxSwift 的 rxswift 示例项目中实现类似的东西 repo .但就我而言,有依赖的可观察量。如果不在 View 模型中使用绑定(bind),我找不到任何解决方案

这是我的 View 模型的结构:

首先是输入、输出和viewmodel的定义

typealias UserListViewModelInput = (
viewAppearAction: Observable<Void>,
deleteAction: Observable<Int>
)

typealias UserListViewModelOutput = Driver<[User]>

typealias UserListViewModel = (UserListViewModelInput, @escaping UserApi) -> UserListViewModelOutput

然后是无法编译的实际实现。

let userListViewModel: UserListViewModel = { input, loadUsers in

let loadedUserList = input.viewAppearAction
.flatMapLatest { loadUsers().materialize() }
.elements()
.asDriver(onErrorDriveWith: .never())

let userListAfterDelete = input.deleteAction
.withLatestFrom(userList) { index, users in
users.enumerated().compactMap { $0.offset != index ? $0.element : nil }
}
.asDriver(onErrorJustReturn: [])

let userList = Driver.merge([loadedUserList, userListAfterDelete])

return userList
}

Viewmodel 有两个工作。首先加载用户列表。其次是删除索引处的用户。最终输出是使用 UserApi 下载的用户列表减去已删除的用户。

这里的问题为了定义userList 我需要定义userListAfterDelete。为了定义 userListAfterDelete,我需要定义 userList

那么有没有办法在不使用 View 模型内部绑定(bind)的情况下打破这个循环?就像保持状态的占位符 observable 或运算符?

最佳答案

这是状态机的工作。您将在下面的代码中看到有两个操作可以影响 User 数组。当 View 出现时,将下载一个新数组,当出现删除时,将删除特定用户。

这可能是处理状态的响应式(Reactive)代码中最常见的模式。如此普遍,以至于整个库都实现了它的一些变体。

let userListViewModel: UserListViewModel = { input, loadUsers in

enum Action {
case reset([User])
case delete(at: Int)
}

let resetUsers = input.viewAppearAction
.flatMapLatest { loadUsers().materialize() }
.compactMap { $0.element }
.map { Action.reset($0) }

let delete = input.deleteAction.map { Action.delete(at: $0) }

return Observable.merge(resetUsers, delete)
.scan(into: [User](), accumulator: { users, action in
switch action {
case let .reset(newUsers):
users = newUsers
case let .delete(index):
users.remove(at: index)
}
})
.asDriver(onErrorJustReturn: [])
}

关于ios - 具有输入输出的 rxswift viewmodel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57299322/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com