处理 Observable.subscribe 的结果时未调用 OnNext

Posted

技术标签:

【中文标题】处理 Observable.subscribe 的结果时未调用 OnNext【英文标题】:OnNext not called when disposing the result of Observable.subscribe 【发布时间】:2017-09-12 14:28:31 【问题描述】:

我订阅了一个 observable,但如果我将一次性添加到我班级的 DisposeBag 中,则永远不会调用 onNext 块。

这是我的代码:

@objc class AppleMusicPlaylistManager: NSObject 

    let disposeBag = DisposeBag()
    let playlists: [MPMediaPlaylist] = []

    func importAppleMusicPlaylist() 
        playlists.forEach  applePlaylist in
            applePlaylist.getItunesStoreTracks().subscribe(onNext:  tracks in
               // Doing things here
            ).addDisposableTo(disposeBag)
        
    

其中getItunesStoreTracks 返回一个RxSwift.Observable<[SoundsMusicITunesStore]>,整个事情就像AppleMusicPlaylistManager().importAppleMusicPlaylist() 一样使用

【问题讨论】:

因为你的 subscribe 返回一个 disposable 只是将它分配给某个变量,然后当你的对象得到 deinit 时处理它 @Lamar 根据我对 RxSwift 的理解,这正是 DisposeBag 正在做的事情。我在这里错过了什么吗? 【参考方案1】:

一切都按预期工作。

disposeBag 的当前逻辑指出,在disposeBag 存活之前,不会处理可观察对象。

在您的情况下 - AppleMusicPlaylistManager().importAppleMusicPlaylist(),您创建了一个管理器,然后调用异步请求,而管理器正在解除分配。因此所有的 observables 也在释放。

为了使其正常工作,您必须将此管理器设置为 shared 并使用此方法:AppleMusicPlaylistManager.shared.importAppleMusicPlaylist() 或将此管理器保存到某个属性,以免立即解除分配。

【讨论】:

以上是关于处理 Observable.subscribe 的结果时未调用 OnNext的主要内容,如果未能解决你的问题,请参考以下文章

使用 Knockout 订阅的循环依赖

Promise和Observable的映射

如何将 Observable 转换为 ReplaySubject?

.unsubscribe 和 .take(1) 的区别

Angular基础 HTTP & Routing

[Javascript] Data ownership, avoid accidently mutation