繁体   English   中英

带输入输出的rxswift视图模型

[英]rxswift viewmodel with input output

我正在尝试从RxSwift repo的 rxswift示例项目中实现类似的目的。 但就我而言,存在依赖的可观察性。 没有在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

因此,有没有一种方法可以在不使用视图模型内部绑定的情况下打破这一循环? 就像可观察到的占位符或保持状态的运算符一样?

这是状态机的工作。 在下面的代码中,您会看到有两个动作会影响User数组。 当出现该视图时,将下载一个新的阵列,当删除时,将删除一个特定的用户。

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

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: [])
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM