2016-09-28 6 views
1

Wenn ich vor der Anmeldung zuArray() hinzufügen, bekomme ich keinen Rückruf.RxSwift toArray() nicht abonnieren

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) 

Vielleicht ist das Problem mit der Funktion getEventsFromCalendar aber noch nicht sicher, warum es funktioniert, wenn ich tun toArray nicht():

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

Antwort

3

Verwenden Sie ein debug() zu überprüfen und sicherzustellen, dass Sie ein Completed Ereignis, wenn es darum (ohne toArray()). toArray() wird nur eine Array emittieren, sobald die Quellsequenz abgeschlossen ist.

-1

Nun können Sie nur einmal zu einer beobachtbaren abonnieren, wenn es nicht mit anderen geteilt (.share) wie

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) 
+1

, die falsch ist. Sie können ganz sicher ** ein "Observable" mehr als einmal abonnieren. Jedes Mal, wenn Sie sich anmelden, erstellen Sie eine brandneue Sequenz, aber das ist völlig in Ordnung, je nachdem, was Sie brauchen. Mit 'share()' erhalten Sie eine gemeinsame Sequenz, die je nach Ihren Bedürfnissen nützlich sein kann. Sie sind jedoch beide möglich und beide nützlich für verschiedene Zwecke. – solidcell

+0

Ich stehe korrigiert –