RXSwift chaining observers and catch errors
我有一些代码,一些可观察到的操作完成后应该侦听,但是我无法以最佳方式编写它。
重要的是,最终的预订结果是事件,并且updateEvent最后运行。
这是我的代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 | /// 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) } } |
我认为我的代码"很丑",我觉得有更好的方法。谢谢!
好吧,这有点干净:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | 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) } |
至少避免了自我捕获和保持周期。但是,如果有任何邀请或删除错误,则可能会使您的系统处于无效状态...