Godfather
Godfather

Reputation: 4340

RxSwift toArray() not subscribing

When i add toArray() before subscribing i get no callback.

    googleCalendarUseCase.getEventsFromCalendars(calendars: selectedCalendars).subscribe(onNext: { (event) in
        print(event.summary) //print thousands of elements
    }).addDisposableTo(disposeBag)
    googleCalendarUseCase.getEventsFromCalendars(calendars: selectedCalendars).toArray().subscribe(onNext: { (events) in
        print(events.count)  // Never gets called
    }).addDisposableTo(disposeBag)

Maybe the problem is with the function getEventsFromCalendar but unsure why it works if i dont do toArray():

func getEventsFromCalendars(calendars: [GoogleCalendar.Calendar], nextPageToken: String? = nil) -> Observable<GoogleCalendar.Event> {
    return Observable<GoogleCalendar.Event>.create { observer -> Disposable in
        var parameters: [String: Any] = [:]
        if let nextPageToken = nextPageToken {
            parameters["pageToken"] = nextPageToken
        }
        _ = self.oauthswift.client.get(GoogleCalendarAPI.events, parameters: parameters, success: { (data, response) in
            if let json = try? JSONSerialization.jsonObject(with: data, options: JSONSerialization.ReadingOptions.allowFragments) as? [String: AnyObject] {
                if let nextPageToken = self.nextPageToken(json: json) {
                    _ = Observable.of(Observable.from(self.getEventsFromJSON(json: json)), self.getEventsFromCalendars(calendars: calendars, nextPageToken: nextPageToken))
                        .merge().subscribe(observer)
                } else {
                    _ = Observable.from(self.getEventsFromJSON(json: json))
                }
            } else {
                observer.onError(CustomError.other)
            }}, failure: { (error) in  observer.onError(CustomError.noInet) }
        )
        return Disposables.create()
    }
}

Upvotes: 1

Views: 1671

Answers (2)

Daniel Poulsen
Daniel Poulsen

Reputation: 1456

Well you can only subscribe once to an observable if it not shared (.share) like

let sharedObservable = googleCalendarUseCase.getEventsFromCalendars(calendars: selectedCalendars).share()

    sharedObservable.subscribe(onNext: { (event) in
        print(event.summary)
    }).addDisposableTo(disposeBag)

    sharedObservable.toArray().subscribe(onNext: { (events) in
        print(events.count)
    }).addDisposableTo(disposeBag)

Upvotes: -1

solidcell
solidcell

Reputation: 7739

Use a debug() to check and ensure that you're getting a Completed event (without toArray()). toArray() will only emit an Array once the source sequence completes.

Upvotes: 8

Related Questions