2017-02-10 5 views
1

Я использую Kugel Library for Notification (https://github.com/TakeScoop/Kugel/tree/swift-3.0). Я хочу знать, как удалить Observer и где в моем коде. Я использую Отменить подписку для библиотеки и ничего не происходитУдалить уведомление обозревателя Swift 3

переопределения Func viewDidDisappear (_ анимированное: 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 {}, но уведомление, которое не убито.

Вы можете HelpMe

Tahnks

+0

Он должен работать, но, пожалуйста, попробуйте это - переопределение Func viewDidDisappear (_ анимированный: Bool) { NotificationCenter.default.removeObserver (само) } –

ответ

0

Try и удалить наблюдателя в viewWillAppear

+0

Это должно быть комментарий, а не ответ! –

+0

@Div Вы абсолютно правы. Должен быть. Но это также ответ на его вопрос – Vandal

+2

Я думаю, что это неправильный ответ. Я думаю, вы имеете в виду 'viewWillDisappear' или' viewDidDisappear'. Но если ответ @ user1883993 правильный, это должен быть принятый ответ. –

2

таргетингом приложение IOS 9.0 и выше или MacOS 10,11, а потом, вам не нужно отменить регистрацию наблюдателя в методе его освобождения. Если ваше приложение предназначено для более ранних выпусков, вам необходимо сохранить ссылку на объект наблюдателя и отправить его вместо «я», также в библиотеке говорится, что он устарел, почему вы его используете?

1

Все это неправильно. Вот правильный способ удаления наблюдателей в Swift (также относится к Obj-C): Согласно документации Apple, вы должны хранить ссылку на своего наблюдателя! NSNotificationCenter addObserver Я не наблюдатель, поэтому NotificationCenter.default.removeObserver(self, name: Notification.Name(rawValue: "SleepMode"), object: nil); ничего не делает. То, что вы должны сделать, это:

  1. Расширение Notification.Name для уведомления: (где вы размещаете уведомление)

    extension Notification.Name { 
        static let notification = Notification.Name(rawValue: "A notification") 
    } 
    
  2. Создать слабую ссылку на ваш наблюдатель с:

    weak var observer: NSObjectProtocol? 
    
  3. Создайте функцию «addObserver» следующим образом: (где вы хотите прослушать уведомление)

    func addObserver() { 
        guard observer == nil else { return } 
        observer = NotificationCenter.default.addObserver(forName: .notification, 
                    object: nil, 
                     queue: .main) { notification in 
        print("Notification triggered") 
    } 
    
  4. Создайте функцию "removeObserver":

    func removeObserver() { 
        guard let observer = observer else { return } 
        NotificationCenter.default.removeObserver(observer) 
    } 
    
  5. Позвоните в функции "addObserver", где бы вам это нужно в коде (скорее всего, из метода viewDidLoad)

  6. вызова «removeObserver», когда вы закончите прослушивание этого уведомления.

Важным моментом здесь является то, что если у вас есть дополнительные сильные ссылки на ваш класс, реализующий уведомление и вы «думаете» наблюдатель удаляется, но это не так, то guard реализация выше предотвращает код от создания несколько наблюдателей. Это особенно относится к некоторым реализациям addObserver в функции viewDidLoad, отсутствующей removeObserver. Доказательство? добавьте точку останова в функцию addObserver в строке, где вы назначаете наблюдателя и редактируете точку останова (щелкните правой кнопкой мыши), затем выберите add action и выберите Sound и выберите опцию Automatically continue after evaluating actions.

enter image description here

Запустить приложение и вернуться назад и вперед в представлении, реализующего наблюдателя. Если количество раз, когда вы слышите звук, постоянно, все готово! В противном случае вы должны увеличить громкость звука каждый раз при входе в представление. Вот так!

Смежные вопросы