可以NotificationTokens被保持在它们内部的线程之外吗?

时间:2018-04-13 11:07:23

标签: swift realm

(我无法在文档中找到这些信息,或者不知道在哪里查看,所以请原谅我,如果已经在某处解释过(链接会有所帮助)。

我的应用创建并使用NSThreads与Realm进行交互。所有线程都在其上设置了Run Loops,因此在它们上创建的Realms将自动刷新。

应用程序使用一个名为ReadThread的线程来设置通知令牌,以便他们可以接收更新并进行一些处理而不会阻塞主线程。

示例(伪代码:

ReadThread {
  func performAsync(_ block: ()->Void) { 
    // execute block on run loop of the thread using self.perform(#selector(), on: self)
  }
}

Singleton {
  let readThread: ReadThread()

  init {
    self.readThread.start()
  }
}

Main Thread:

Class A {
   private var token: NotificationToken?


  init {
    Singleton.readThread.perform {
      let token = realm.observe() { [weak self] (notification: Realm.Notification, realm) in
                    self?.doWork()
                    DispatchQueue.main.async { [weak self] in
                      self?.notifyUI()  
                    }
                }

                DispatchQueue.main.async {[weak self] in self?.token = token }
    }
  }
}

我们的想法是在ReadThread上创建令牌,但令牌存储在不同线程(主线程)上的实例变量中。令牌线程是否足够安全,主线程对象可以在令牌上调用invalidate(),或者如果主线程对象被释放,令牌将自动失效?

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

学到了很难,但答案是否定的,预兆必须在生成令牌的同一个线程下失效。否则,Realm.verifyThread检查将抛出运行时异常。