Ahm*_*ine 2 notifications uiviewcontroller swift3
我使用 Kugel 库进行通知(https://github.com/TakeScoop/Kugel/tree/swift-3.0)。我想知道如何删除 Observer 以及在我的代码中的位置。我为图书馆使用取消订阅,但没有任何反应
覆盖 func viewDidDisappear(_ 动画:布尔){
super.viewDidDisappear(animated)
Kugel.unsubscribe("SleepMode")
Kugel.unsubscribe("SleepModeSynchroMode")
Kugel.unsubscribe(self, name: NSNotification.Name(rawValue: "SleepMode"), object: nil)
Kugel.unsubscribe(self, name: NSNotification.Name(rawValue: "SleepModeSynchroMode"), object: nil)
NotificationCenter.default.removeObserver(self, name: Notification.Name(rawValue: "SleepMode"), object: nil);
NotificationCenter.default.removeObserver(self, name: Notification.Name(rawValue: "SleepModeSynchroMode"), object: nil);
}
Run Code Online (Sandbox Code Playgroud)
当我回到其他视图时,我想删除订阅通知(添加观察者)。我使用 denit { } 但没有杀死的通知。
你能帮助我吗
塔克斯
小智 5
那都是错的。这是在 Swift 中删除观察者的正确方法(也适用于 Obj-C):根据 Apple 的文档,您必须保留对观察者的引用!NSNotificationCenter addObserver Self 不是观察者,所以NotificationCenter.default.removeObserver(self, name: Notification.Name(rawValue: "SleepMode"), object: nil);什么都不做。你需要做的是:
为您的通知扩展 Notification.Name:(您发布通知的位置)
extension Notification.Name {
static let notification = Notification.Name(rawValue: "A notification")
}
Run Code Online (Sandbox Code Playgroud)使用以下命令创建对观察者的弱引用:
weak var observer: NSObjectProtocol?
Run Code Online (Sandbox Code Playgroud)创建一个“addObserver”函数,如下所示:(你想在那里收听通知)
func addObserver() {
guard observer == nil else { return }
observer = NotificationCenter.default.addObserver(forName: .notification,
object: nil,
queue: .main) { notification in
print("Notification triggered")
}
Run Code Online (Sandbox Code Playgroud)创建一个“removeObserver”函数:
func removeObserver() {
guard let observer = observer else { return }
NotificationCenter.default.removeObserver(observer)
}
Run Code Online (Sandbox Code Playgroud)从代码中需要的任何位置调用“addObserver”函数(很可能来自您的viewDidLoad方法)
收听完通知后调用“removeObserver”函数。
这里的重要一点是,如果您对实现通知的类有一个额外的强引用,并且您“认为”观察者已被删除,但事实并非如此,那么guard上面的实现会阻止您的代码创建多个观察者。对于viewDidLoad缺少 a的函数中 addObserver 的某些实现尤其如此removeObserver。证明?在功能的addObserver在您指定的观察员和编辑断点(右键)然后选择行添加一个断点add action,并挑选Sound和选择选项Automatically continue after evaluating actions。
启动您的应用程序并在实现观察者的视图中来回切换。如果您听到声音的次数是恒定的,那么您就完成了!否则,每次进入视图时,此处的声音都应增加 1。你去吧!
| 归档时间: |
|
| 查看次数: |
7779 次 |
| 最近记录: |