【问题标题】:How to manage Realm Notification Tokens centrally如何集中管理领域通知令牌
【发布时间】:2021-01-27 19:38:22
【问题描述】:

我的应用程序类周围散布着许多通知令牌。我想创建一个类,例如一个 RealmNotificationTokensManager,用于跟踪实例化的令牌,以便能够知道哪些令牌在特定时间点处于活动状态或在应用程序中查看以确保它们及时失效等。

我的应用中总共有大约 35 个通知令牌。

除了将所有这些标记作为管理器类的属性之外,我还希望能够将它们分组到一个数组中,以便能够对其运行查询。但是,如果我手动维护该数组,例如如果我添加一个新令牌,我需要确保我也将它添加到所有令牌的数组中。这有点容易出错,因为人们可能会忘记将新令牌添加到数组中。

据我了解,使用enumCaseIterable 协议可能会使其更安全,但我找不到办法。

有人能指点一下如何实现吗?

【问题讨论】:

    标签: swift enums notifications realm token


    【解决方案1】:

    如果我正确理解了这个问题,那么创建一个“集中式”通知管理器应该是相当简单的。请记住,为了简洁起见,这是非常简单的,但我们就是这样做的。

    假设我们有一个 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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-01-31
      • 2020-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-04
      相关资源
      最近更新 更多