为什么我的班级不听我的活动?

问题描述

我想显示一个监听downloadFinished()方法的模式,然后在ui线程中显示该模式。

在我的ManagerClass的onCompleted块中,所有下载都结束了,我正在监听所有事件:

...
onCompleted: {
           
            Log.db.info(message: "Download successful!")
            
            try? self.downloadManager?.endDownload()
              
            AppEvents.downloadFinished.emit()
        })

emit()就是:

dispatchQueue.main.async {
            NotificationCenter.default.post(name:self.name(),object:nil)
        }

所以我认为最好的监听事件的方法是创建一个新的订阅它的类:

import RealmSwift

class MessagesManager {
    
    private var syncDBManager: SyncDBManager?

    static let shared = MessagesManager()
    
    init() {
        
        _ = NotificationCenter.default.rx.notification(AppEvents.syncFinished.name())
            .subscribe(onNext: { _ in
                self.showModal()
            })
        
        showModal()
    }
    
    private func showModal() {
      //show modal
    }
}

调用?AppEvents.downloadFinished.emit()`时,如何调用showModal()

NotificationCenter不应该听吗?


当我将 MessagesManager 的实例添加 AppDelegate didFinishLaunchingWithOptions 方法中时:

_ = MessageManager.shared

模态出现一秒钟然后消失。但是我认为此时它显示为时已晚,因为下载过程已经以 AppEvents.downloadFinished.emit() 结尾。

解决方法

我从未使用过RxSwift,但是我很确定NotificationCenter.defau...返回的是Combines AnyCanclable。您需要将引用保存在某处,因为否则您的init()完成后,订阅就消失了。如果它像合并的方式工作,请尝试以下操作:

private var cancelable: Disposable?

init() {
    ...
   cancelable = NotificationCenter.default.rx.notification(AppEvents.syncFinished.name())
        .subscribe(onNext: { _ in
            self.showModal()
        })
    ...
}

修改:
根据{{​​3}},您需要Rx'Cancelable被称为Disposable