【问题标题】:How to use Realm notifications如何使用领域通知
【发布时间】:2015-07-31 19:59:42
【问题描述】:

我正在尝试使用 Realm 数据库在 OS X 中编写应用程序。在我的程序中,我需要等待 Realm 写入完成,然后调用一个新的 veiwcontroller。经过大量研究,似乎使用 Realm 内置的通知中心是合适的。根据 Realm 文档,格式应该像这样工作

let token = realm.addNotificationBlock { notification, realm in
    viewController.updateUI()
}

我知道这是一个快速关闭,但我不知道如何使用它。如果我把代码改成这个

let token = realm.addNotificationBlock { notification, realm in
   println("The realm is complete")
}

写入完成后会打印到我的调试屏幕吗?或者更简单地说,我如何在收到通知后才执行一些代码?

如果我将上面的代码放在我的应用程序中,我在调试屏幕中看不到我的行,我只看到以下内容:

2015-07-31 16:08:17.138 治疗发票[27979:2208171] RLMNotificationToken 在未取消注册通知的情况下发布。 您必须保留从返回的 RLMNotificationToken addNotificationBlock 并调用 removeNotification: 当你不再 希望接收 RLMRealm 通知。

【问题讨论】:

    标签: ios swift cocoa realm


    【解决方案1】:

    来自Realm latest docs(3.0.1):

    添加notificationToken.invalidate() 以便从通知中取消注册。

    详细说明:

    • notificationToken声明为类变量

      var notificationToken: NotificationToken?
      
    • viewDidLoad()中设置notificationToken

      notificationToken = realm.observe { [unowned self] note, realm in
         self.tableView.reloadData()
      }
      
    • viewWillDisappear(animated: Bool) 的通知中取消注册

      notificationToken?.invalidate()
      

    编辑笔记:

    1. notificationToken.stop() 已弃用。
    2. realm.addNotificationBlock... 会导致如下错误:

      “领域”类型的值没有成员“addNotificationBlock”

    【讨论】:

      【解决方案2】:

      notificationToken 设为 ivar:

      var notificationToken: NotificationToken?
      
      
      deinit{
          //In latest Realm versions you just need to use this one-liner
          notificationToken?.stop()
      
          /* Previously, it was needed to do this way
          let realm = Realm()
          if let notificationToken = notificationToken{
              realm.removeNotification(notificationToken)
          }
          */
      }
      
      override func viewDidLoad() {
          super.viewDidLoad()
          let realm = Realm()
          notificationToken = realm.addNotificationBlock { [unowned self] note, realm in
             self.tableView.reloadData()
          }
      ...
      }
      

      【讨论】:

      • realm.removeNotificationdeprecated,使用notificationToken.stop()
      • notificationToken.stop() 旧,使用 notificationToken.invalidate()
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多