如何在Swift的共享领域中同步对象

时间:2017-08-08 19:46:53

标签: realm realm-mobile-platform realm-object-server

在搜索the documentation之后,我最近了解到,只有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中查询?

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

1 个答案:

答案 0 :(得分:1)

  

共享领域(全球可供我的应用的所有用户使用)只能通过Realm.asyncOpen

进行查询

这是不正确的。如果用户只有只读对Realm的访问权限,则必须使用Realm.asyncOpen获取。那明确是documentation you linked to states

  

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

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

  

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

此已同步的Realm在本地持久保存,并将在应用程序启动时保留。

  

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

没有

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

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

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

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

这意味着在成功asyncOpen调用之后的任何时间,只要您没有通过asyncOpen可能没有获得最新数据,就可以同步访问Realm ROS。

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