0

在浏览了文档之后,我最近了解到共享领域(对我的应用程序的所有用户全局可用)只能使用Realm.asyncOpen. 例如,我有一个/shared对任何用户都具有只读访问权限的领域。我尝试以通常的方式查询它,但它返回零个对象。但是,如果我这样查询它,它会起作用:

Realm.asyncOpen(configuration: sharedConfig) { realm, error in
  if let realm = realm {
    // Realm successfully opened
    self.announcements = realm.objects(Announcement.self)

    print(self.announcements)
    self.tableView.reloadData()

  } else if let error = error {
    print(error)
  }
}

此方法明显比通常的领域查询慢,因为它似乎是从服务器获取数据,而不是从本地已同步的领域。

这是否意味着下拉的对象永远不会存储在领域的本地副本中,而是每次我访问它们时都会从 ROS 中查询?

换句话说,共享领域是否被拉出而不是同步?

4

1 回答 1

1

只能使用以下方式查询共享领域(对我的应用程序的所有用户全局可用)Realm.asyncOpen

这是不正确的。如果用户只有对 Realm的只读访问权限,则必须使用Realm.asyncOpen. 这就是您链接到 states的文档的明确内容。

此方法明显比通常的领域查询慢,因为它似乎是从服务器获取数据,而不是从本地已同步的领域。

几乎正确。是的,数据是从服务器获取的,但不是从头开始获取整个 Realm。只有自上次 Realm 与您的本地副本同步以来的新数据。

这是否意味着下拉的对象永远不会存储在领域的本地副本中,而是每次我访问它们时都会从 ROS 中查询?

这个同步的 Realm 会在本地持久化,并将在应用程序启动时保留。

换句话说,共享领域是否被拉出而不是同步?

不。


退后一步,让我们解释一下这里发生了什么。

如果您尝试同步打开只读同步 Realm,则会收到“permission denied”错误的原因是,在初始化时,将创建一个本地 Realm 文件,执行写入操作以写入 Realm 的模式(即创建 db 表,列和元数据)立即。但是,由于用户没有对领域的写入权限,领域对象服务器 (ROS) 会拒绝更改并触发您的全局错误处理程序,通知您用户进行了非法修改文件的尝试。

不会发生这种情况的原因asyncOpen是它是一个异步操作,因此不需要立即给你一个有效的 Realm ,所以它不需要通过将模式写入它来“引导”它。相反,它会从 ROS 请求 Realm 的最新状态,并在调用开始时的最新状态完全可用时将其返还给您。

话虽如此,如果 Realm 的本地副本已经初始化了它的模式(即在成功asyncOpen调用之后),并且由默认模式或在中指定的自定义对象类型定义的内存模式Realm.Configuration没有改变,那么没有将尝试将架构写入文件。

这意味着在成功调用后的任何时候,只要您对可能没有来自 ROS 的最新数据感到满意,asyncOpen就可以同步访问 Realm 而无需通过。asyncOpen

因此,在您的情况下,您似乎只想asyncOpen用于第一次访问领域,因此您可以保持该状态(使用另一个领域或 NSUserDefaults)并检查它以确定是否打开领域异步或同步。

于 2017-08-08T20:34:26.027 回答