我使用Kugel Library进行通知(https://github.com/TakeScoop/Kugel/tree/swift-3.0)。我想知道如何删除Observer以及我的代码中的位置。我使用Unsubscribe库,没有任何反应
覆盖func viewDidDisappear(_ animated:Bool){
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);
}
当我回到其他视图时,我想删除订阅通知(添加观察者)。 我使用denit {}但是没有杀死的通知。
你能帮忙吗
Tahnks
答案 0 :(得分:4)
一切都是错的。这是在Swift中删除观察者的正确方法(也适用于Obj-C):
根据Apple的文档,你必须保留对观察者的参考! NSNotificationCenter addObserver自我不是观察者,因此NotificationCenter.default.removeObserver(self, name: Notification.Name(rawValue: "SleepMode"), object: nil);
没有做任何事情。
你要做的是:
为您的通知扩展Notification.Name :(您发布通知的地方)
extension Notification.Name {
static let notification = Notification.Name(rawValue: "A notification")
}
使用以下命令为您的观察者创建弱引用:
weak var observer: NSObjectProtocol?
创建" addObserver"功能如下:(你想听通知的地方)
func addObserver() {
guard observer == nil else { return }
observer = NotificationCenter.default.addObserver(forName: .notification,
object: nil,
queue: .main) { notification in
print("Notification triggered")
}
创建" removeObserver"功能:
func removeObserver() {
guard let observer = observer else { return }
NotificationCenter.default.removeObserver(observer)
}
致电您的" addObserver"在您的代码中从您需要的任何地方运行(很可能来自您的viewDidLoad
方法)
调用" removeObserver"完成收听通知后的功能。
这里重要的一点是,如果您对实施通知的班级有更强的参考,那么您认为"观察者被移除但事实并非如此,那么上面的guard
实现会阻止您的代码创建多个观察者。对于viewDidLoad
函数中缺少removeObserver
的addObserver的某些实现,情况尤其如此。
证明?在addObserver函数中为您指定观察者的行添加一个断点并编辑断点(右键单击),然后选择add action
并选择Sound
并选择Automatically continue after evaluating actions
选项。
启动您的应用并在实现观察者的视图中来回移动。如果您听到声音的时间不变,那么您就完成了!否则,每次进入视图时,声音都应增加1。你去吧!
答案 1 :(得分:3)
如果您的应用面向iOS 9.0及更高版本或macOS 10.11及更高版本,则无需在其取消分配方法中取消注册观察者。如果您的应用程序定位于早期版本,则需要保留对observer对象的引用并提交它而不是“self”,同时库也说它已弃用,为什么要使用它?
答案 2 :(得分:0)
尝试并删除viewWillAppear中的观察者