Как я могу повторить ту же магию c в NSNotificationCenter, где он автоматически отменяет регистрацию наблюдателей? - PullRequest
0 голосов
/ 16 марта 2020
NotificationCenter.default.addObserver(forName: NSNotification.Name.NSManagedObjectContextObjectsDidChange, 
object: context, queue: nil) { notification in /.../ }

Когда вы регистрируетесь на NSNotifcation, как это, согласно документации вам не нужно отменять регистрацию

Обсуждение Если ваше приложение предназначено для iOS 9.0 и более поздних версий или macOS 10.11 и более поздних версий Вам не нужно отменять регистрацию наблюдателя в методе deallo c. В противном случае вам следует вызвать этот метод или removeObserver: перед наблюдателем или любым объектом, указанным в addObserverForName: объект: очередь: usingBlock: или addObserver: селектор: имя: объект: освобожден.

Но до iOS 9.0. Вам нужно было бы отменить такую ​​регистрацию

deinit {
  NSNotificationCenter.defaultCenter().removeObserver(self, 
    name: NSNotification.Name.NSManagedObjectContextObjectsDidChange, 
    object: nil)
}

Но как NSNotificationCenter узнает, что нужно отменить регистрацию моего объекта при его освобождении?

Я пытаюсь реализовать похожий тип логики c и мне также хотелось бы эту функцию автоматической отмены регистрации. Рассмотрим:

Class Publisher {
  var callback:()-> Void
  func subscribe( callback:()-> Void)  {
    self.callback = callback
  }
}

Class Subscriber {
  var publisher = Publisher()
  init() {
   publisher.subscribe { /*do something*/ }
  }
  deinit {
     publisher.unsubscribe()  //I want this to happen automatically
  }
}

1 Ответ

0 голосов
/ 16 марта 2020

Но как NSNotificationCenter узнает, как отменить регистрацию моего объекта при его освобождении?

Ссылка центра уведомлений на цель - слабая AR C. Таким образом, он автоматически обнуляется, когда цель исчезает. Поэтому, когда центр уведомлений готов к публикации этой цели, он сначала проверяет, равняется ли он нулю, и, если это так, говорит «О, хорошо, эта цель исчезла» и отменяет регистрацию цели.

Что касается вашего основного вопроса, именно так publi sh -and-subscribe работает уже с платформой Combine. Подписчик помещается в AnyCancellable и сохраняется, а после освобождения отменяется и отправляет издателю сообщение cancel по конвейеру.

...