我如何在 NSNotificationCenter 中复制同样的魔法,它会自动注销观察者?

How can I replicate the same magic in NSNotificationCenter where it automatically unregisters observers?

NotificationCenter.default.addObserver(forName: NSNotification.Name.NSManagedObjectContextObjectsDidChange, 
object: context, queue: nil) { notification in /.../ }

当你像这样注册NSNotifcation时,根据文档你不需要注销

Discussion If your app targets iOS 9.0 and later or macOS 10.11 and later, you don't need to unregister an observer in its dealloc method. Otherwise, you should call this method or removeObserver: before observer or any object specified in addObserverForName:object:queue:usingBlock: or addObserver:selector:name:object: is deallocated.

但在 iOS 9.0 之前,您必须像这样注销

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

但是 NSNotificationCenter 如何知道在对象被释放时注销它?

我正在尝试实现类似的逻辑,我也想要这个自动注销功能。考虑:

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
  }
}

But how does NSNotificationCenter know to unregister my object when it gets deallocated?

通知中心对目标的引用是 ARC-weak。因此,当目标不存在时,它会自动消失。因此,当通知中心准备好 post 到该目标时,它首先查看它是否为零,如果是,它会说 "Oh, well, that target is gone," 并注销该目标。

至于您的主要问题,这正是发布和订阅如何与 Combine 框架一起工作。订阅者被包装在 AnyCancellable 中并被存储,当它被释放时,它被取消并通过管道向发布者发送一条 cancel 消息。