如果我正确理解了这个问题,那么创建一个“集中式”通知管理器应该是相当简单的。请记住,为了简洁起见,这是非常简单的,但我们就是这样做的。
假设我们有一个 PersonClass 和 DogClass 并且我们想为这些类型的对象添加观察者。我们将有一个包含人和狗结果的类 var 以及代表经理的 var
class ViewController: NSViewController {
var peopleResults: Results<PersonClass>? = nil
var dogResults: Results<DogClass>? = nil
let manager = NotificationManager()
然后在途中的某个地方,我们将人和狗加载到结果中并添加观察者
func observePeople() {
var token = NotificationToken()
token = self.peopleResults!.observe { changes in
switch changes {
...
}
}
self.manager.notificationArray.append(token)
}
然后是狗
func observeDogs() {
var token = NotificationToken()
token = self.dogResults!.observe { changes in
switch changes {
...
}
}
self.manager.notificationArray.append(token)
}
通知管理器看起来像这样
class NotificationManager {
var notificationArray = [NotificationToken]()
}
现在下一部分取决于用例
如果我添加一个新令牌,我需要确保我也将它添加到数组中
的所有令牌。这有点容易出错,因为人们可能会忘记添加
数组的新标记。
我了解该声明的要点,因此如果您知道将使用的确切通知,则可以将这些通知实施到管理器本身中。因此,在应用程序的任何地方安装创建令牌,在管理器中完成所有操作
例如
class NotificationManager {
var notificationArray = [NotificationToken]()
func observeDogs() {
let dogResults = realm.objects(DogClass.self)
var token = NotificationToken()
token = dogResults.observe { changes in
switch changes {
//..
}
}
self.notificationArray.append(token)
}
}
那么当你想观察狗的时候,一条线就可以了
func observeDogs() {
self.manager.observeDogs()
}
如果您想“锁定”,那么使用枚举是个好主意
enum Observers {
case people
case dogs
}
class NotificationManager {
var notificationArray = [NotificationToken]()
func addObserverTo(whatToObserve: Observers) {
switch whatToObserve {
case .people:
//add people observer
case .dogs:
//add dogs observer
default:
break
}
}
}
然后这样调用
self.manager.addObserverTo(whatToObserve: .people)