在浏览文档后,我最近了解到共享领域(全局可供我的应用程序的所有用户使用(只能通过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 查询?
换句话说,共享领域是拉取而不是同步的吗?
领域(全局可供我的应用程序的所有用户使用(只能使用
Realm.asyncOpen
这是不正确的。如果用户对某个 Realm 只有只读访问权限,则必须通过Realm.asyncOpen
获取该访问权限。这就是您链接到的文档状态的明确内容。
此方法明显比通常的领域查询慢,因为它似乎从服务器而不是已经同步的本地领域获取数据。
几乎正确。是的,数据是从服务器获取的,但不是从头开始获取整个 Realm 数据库。只有自上次 Realm 数据库与本地副本同步以来的新数据。
这是否意味着下拉的对象永远不会存储在域的本地副本中,而是在每次访问它们时从 ROS 查询?
这个同步的 Realm 数据库会在本地持久保存,并将在应用程序启动时保留。
换句话说,共享领域是拉取而不是同步的吗?
不。
退后一步,让我们解释一下这里发生了什么。
如果您尝试同步打开只读同步的 Realm 数据库,您会收到"权限被拒绝"错误的原因是,在初始化时,将创建一个本地 Realm 文件,执行写入操作以立即写入 Realm 的模式(即创建数据库表、列和元数据(。但是,由于用户没有对 Realm 数据库的写访问权,Realm 对象服务器 (ROS( 会拒绝这些更改并触发您的全局错误处理程序,通知您您的用户非法尝试修改该文件。
asyncOpen
不会发生这种情况的原因是它是一个异步操作,因此不需要立即为您提供有效的 Realm 数据库,因此它不需要通过向它写入模式来"引导"它。相反,它会从 ROS 请求 Realm 数据库的最新状态,并在调用开始时完全可用时将其返还给您。
话虽如此,如果 Realm 数据库的本地副本已经初始化了它的模式(即在成功的asyncOpen
调用之后(,并且由默认模式或Realm.Configuration
中指定的自定义对象类型定义的内存中模式没有更改,那么不会尝试将任何模式写入该文件。
这意味着asyncOpen
,只要您没有来自 ROS 的最新数据,就可以同步访问 Realm 数据库,而无需经过asyncOpen
。
因此,在您看来,您似乎只想在第一次访问 Realm 数据库时使用asyncOpen
,因此您可以保持该状态(使用另一个 Realm 数据库或 NSUserDefaults(并检查它以确定是异步还是同步打开 Realm 数据库。