【问题标题】:RxSwift toArray() not subscribingRxSwift toArray() 未订阅
【发布时间】:2016-09-28 09:11:52
【问题描述】:

当我在订阅前添加 toArray() 时,我没有得到回调。

    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)

也许问题出在 getEventsFromCalendar 函数上,但如果我不执行 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()
    }
}

【问题讨论】:

    标签: ios swift rx-swift


    【解决方案1】:

    使用debug() 来检查并确保您收到Completed 事件(没有toArray())。 toArray() 只会在源序列完成后发出 Array

    【讨论】:

      【解决方案2】:

      如果未共享,您只能订阅一次 observable (.share) 喜欢

      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)
      

      【讨论】:

      • 这是不正确的。您肯定可以多次订阅Observable。每次订阅时,您都会创建一个全新的序列,但这完全取决于您的需要。使用share() 将为您提供一个共享序列,根据您的需要,它也很有用。不过,它们都是可能的,并且都可用于不同的目的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多