关于swift:RXSwift链接观察者并捕获错误

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)
}

至少避免了自我捕获和保持周期。但是,如果有任何邀请或删除错误,则可能会使您的系统处于无效状态...