2017-08-08 93 views
0

经过淘汰the documentation后,我最近得知共享领域(全局可用于我的应用程序的所有用户)只能用Realm.asyncOpen查询。例如,我有一个/shared领域,它对任何用户都具有只读权限。我试图以通常的方式查询它,但它返回了零个对象。但是,如果我查询它这个样子,它的工作原理:对象如何在Swift中的共享领域中同步

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中查询?

换句话说,共享领域拉和未同步?

回答

1

共享领域(在全球范围提供给我的应用程序的所有用户)只能与Realm.asyncOpen

质疑这是不正确。如果用户只有只读访问领域,它必须与Realm.asyncOpen获得。这是明确的什么documentation you linked to states

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

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

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

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

换句话说,是共享领域拉和不同步?


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

如果您尝试同步打开只读同步的Realm,则会出现“权限被拒绝”错误的原因是初始化后,将创建本地Realm文件,执行写入操作以写入Realm架构(即立即创建数据库表,列&元数据)。但是,由于用户没有对Realm的写入权限,因此Realm对象服务器(ROS)会拒绝更改并触发全局错误处理程序通知您用户已修改文件的非法尝试。

为什么这不符合asyncOpen发生的原因是,它是一个异步操作,因此不需要给你一个有效的境界立即,所以它并不需要通过编写“引导”它架构。相反,它会从ROS请求最新的Realm状态,并在该呼叫开始时的最新状态完全可用时将其发回给您。这就是说,如果Realm的本地副本已经初始化其架构(即成功调用asyncOpen后),并且由默认架构定义的内存架构或Realm.Configuration中指定的定制对象类型hasn没有改变,那么就不会试图将模式写入文件。

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

所以在你的情况下,它看起来好像你只想用asyncOpen来第一次访问Realm,所以你可以坚持这个状态(使用另一个Realm或NSUserDefaults)并检查它是否或不要异步或同步打开Realm。

+0

很好的答案,谢谢。那么,我可以通过将领域全局写入来解决整个问题吗?我并不担心这个问题的安全性,因为我的应用程序不会提供任何写入领域的机制。 –

+0

是的,如果Realm是全局可写的,你就不会有这个问题,但我想认为我所概述的解决方案不会牺牲访问控制模型那么麻烦,但那是你的呼叫。 – jpsim

+0

嗯......你是说你在用'asyncOpen'初始化'/ shared'领域后,我仍然可以用'NotificationToken'来监听更改,并像任何普通领域一样进行交互?我只需要'asyncOpen'来获取模式更改? –