【问题标题】:RXSwift chaining observers and catch errorsRXSwift 链接观察者并捕获错误
【发布时间】:2020-06-17 19:09:19
【问题描述】:

我有一些代码应该在某些可观察操作完成时进行监听,但我无法以最佳方式编写它。

重要的是最终订阅的结果是事件,并且 updateEvent 最后运行。

这是我的代码:

/// Update Event
///
/// Updates an event and invites or removes any members from the event before updating the actual event information. This ensures newly updated event to contain the updated list of attendes
///
/// - Parameters:
///   - event: The event to update
///   - group: The group that the event belongs to
///   - newMembers: A list of new group members that should be invited to the invited
///   - removeMembers: A list of event attendees that should be removed from the event
func updateEvent(_ event: EventModel, _ group: GroupModel, newMembers: [MemberModel], removeMembers: [AttendanceModel]) {

    let updateEventObserver = self.repository.updateEvent(group, event)
    var memberObservers: [Observable<AttendanceModel>] = []

    if newMembers.count > 0 {
        memberObservers.append(contentsOf: newMembers.map { (member) in
            return self.repository.inviteToEvent(member: member, event: event, group: group)
        })
    }

    if removeMembers.count > 0 {
        memberObservers.append(contentsOf: removeMembers.map { (member) in
            return self.repository.removeFromEvent(member: member, event: event, group: group)
        })
    }

    if memberObservers.count > 0 {

        Observable
            .zip(memberObservers)
            .subscribe(onNext: { (_) in
                updateEventObserver
                    .subscribe(onNext: { event in
                        self.presenter.eventSuccessfullyUpdated(event)
                    }, onError: { error in
                        self.presenter.failedWithError(error)
                    }).disposed(by: self.disposeBag)
            }, onError: { (error) in
                self.presenter.failedWithError(error)
            }).disposed(by: self.disposeBag)
    } else {
        updateEventObserver
            .subscribe(onNext: { event in
                self.presenter.eventSuccessfullyUpdated(event)
            }, onError: { error in
                self.presenter.failedWithError(error)
            }).disposed(by: self.disposeBag)
    }

}

我认为我的代码“丑陋”,我觉得有更好的方法。谢谢!

【问题讨论】:

    标签: swift rx-swift


    【解决方案1】:

    嗯,这有点干净:

    func updateEvent(_ event: EventModel, _ group: GroupModel, newMembers: [MemberModel], removeMembers: [AttendanceModel]) {
    
        let invitedResults = newMembers
            .compactMap { [repository] member in
                repository?.inviteToEvent(member: member, event: event, group: group)
            }
    
        let removedResults = removeMembers
            .compactMap { [repository] member in
                repository?.removeFromEvent(member: member, event: event, group: group)
            }
    
        Observable.zip(invitedResults + removedResults)
            .flatMap { [repository] _ in repository?.updateEvent(group, event) ?? .empty() }
            .subscribe(
                onNext: { [presenter] event in
                    presenter?.eventSuccessfullyUpdated(event)
                },
                onError: { [presenter] error in
                    presenter?.failedWithError(error)
                }
            )
            .disposed(by: disposeBag)
    }
    

    它至少避免了捕获自我并进行保留循环。但是,如果 任何 邀请或删除错误可能会使您的系统处于无效状态...

    【讨论】:

    • 嘿,谢谢!如果邀请或删除失败,是否无法捕获错误并停止序列?
    • 是的,这是默认行为,这就是问题所在。例如,如果前三个邀请成功但第四个失败,则不会调用 updateEvent 并且任何其他邀请/删除都将取消(由于抛出的错误。)您的服务器会知道该怎么做吗?情况?
    • 谢谢。我喜欢你的回答,我已经看了好几遍了。
    猜你喜欢
    • 1970-01-01
    • 2013-02-12
    • 2016-07-21
    • 1970-01-01
    • 1970-01-01
    • 2018-06-03
    • 2018-01-10
    • 2018-02-11
    • 2017-07-20
    相关资源
    最近更新 更多