Realm mobile platform相关了解

23. 二月 2017 iOS 0

Realm mobile platform相关了解

Realm是一个轻量级的数据库,用起来很便捷,不需要额外的对数据库层的封装,仅仅建立一个model就可以了。近期,realm又推出了让人兴奋的Realm mobile platform,这个移动端的数据平台,带来给我们一个新的功能:sync,同步数据到服务器端:具体介绍请看链接,据官方称,这个同步数据,甚至可以达到实时同步的境界。所以,值得我们去研究。

平台还是依然依附于realm mobile database,但是增加了sync,本文主要研究和翻译sync这一章节内容,基础的realm用法参看realm中文网文档

SYNC同步

Realm Mobile Platform扩展了Realm Mobile数据库的功能,实现跨设备的数据自动同步。 为了支持这种附加功能,提供了新的类型和方法。 这些特定用于同步的API是对Realm Mobile Platform API的严格附加扩展,如下所述。

Users用户

用户是Realm Mobile Platform的基本组件之一。 用户由SyncUser类型表示。

每个realm的同步配置是针对一个用户的。 要打开一个已同步的Realm,需要一个登录的用户。 为了创建和登录用户,需要两个值:

  1. 您要连接的域对象服务器的URL。
  2. 唯一标识用户的SyncCredentials值。 ###Server URL 认证服务器URL仅仅是表示域对象服务器的位置的URL。

有关服务器URL的更多详细信息,请参阅我们的authentication documentation

Authentication验证

身份验证用于建立用户身份并将其登录。有关Realm Mobile Platform支持的身份验证提供程序列表,请参阅我们的身份验证文档。 给定用户的凭证信息由SyncCredentials值表示。 以下是配置为与各种提供程序进行身份验证的凭据的一些示例:

大多数这些凭证只需使用该服务提供的身份验证令牌。 您的应用程序就是负责登录服务并获取令牌。 用户名和密码凭证类型是唯一的,因为它完全由Realm Server管理,可以完全控制应用程序的用户管理。 它的工厂方法还接受一个布尔参数,该参数指示是否应该注册新用户,或者是一个已存在的账户。使用现有用户的用户名注册新用户或者登录一个不存在的用户时都会抛出错误。

Authenticating the User 验证用户

要创建用户,请调用SyncUser.logIn()。 这个工厂方法将初始化用户,异步地将它们登录到Realm对象服务器,然后如果登录过程成功,则提供用户对象以供回调块中使用。 如果登录过程由于任何原因失败,错误对象将被传递到回调中。

Realm Mobile Platform允许应用程序同时支持多个用户。 例如,考虑支持连接到多个电子邮件帐户的电子邮件客户端应用程序。 多个用户(每个电子邮件帐户一个)可以在任何给定时间进行身份验证,所有活动用户都可通过User.all()

Logging Out

要将用户从其帐户中注销,请调用SyncUser.logOut()。 任何挂起的本地更改将继续上传,直到Realm对象服务器完全同步。 然后,所有他们的本地同步的Realms将从他们的设备中删除。

Openning a Synchronized Realm 开启一个同步的Realm

使用与用于创建标准的Realms相同的Realm.Configuration和工厂方法创建同步的Realms。

同步的Realms必须在其Realm.Configuration上使用SyncConfiguration值设置syncConfiguration属性。 Realm.Configuration是使用SyncUser和Realm URL构成的,它表示Realm对象服务器上已同步的Realm的位置。 此URL可以包含波浪符号(),其将被透明地扩展以表示用户的唯一标识符。 例如,下面可能是一个Realm的网址,表示“Widgets”的Realm,每个用户都有一个副本:realms://acme.example.com/~/widgets。 一个用户可能具有唯一标识符5917268.“Widgets”领域的领域URL将扩展为:realms://acme.example.com/5917268/widgets。 另一个用户可能具有唯一标识符8581230.他们的域URL将扩展为:realms://acme.example.com/8581230/widgets。这使您的应用程序逻辑工作在一个代表当前用户的一个realm可以使所有用户访问的副本,而无需担心为每个单独用户管理URL的唯一扩展表示。 已同步的Realm的配置信息中不能具有inMemoryIdentifierfileURL配置。 设置这两个属性将自动删除syncConfiguration属性。 该框架负责管理同步区域如何缓存或存储在磁盘上。 以下示例显示如何在给定用户对象和Realm URL的情况下打开已同步的Realm:

Sync Sessions

已同步的Realm与Realm对象服务器的连接由SyncSession对象表示。 表示由特定用户打开的Realms的会话对象可以使用SyncUser.allSessions()SyncUser.session(for :) API从该用户的SyncUser对象中检索。

Basic Operations

可以使用state属性检索基础会话的状态。 这可用于检查会话是否处于活动状态,未连接到服务器或处于错误状态。

如果会话有效,configureation属性将包含一个SyncConfiguration值,可用于打开同一个Realm的另一个实例(例如,在不同的线程上)。

Progress Notifications

会话对象允许您的应用程序通过在会话对象上注册progress notification blocks来监视会话上传到Realm对象服务器和从Realm对象服务器下载的状态。

progress notification blocks将由它们最初注册的线程的runloop上的同步子系统周期性地调用。 如果没有runloop存在,将创建一个。 (实际上,这意味着你可以在GCD的后台队列上注册这些块,并且它们会正常工作。)可以在会话对象上同时注册所需的多个block。 Block可以配置为报告上载进度或下载进度。 每次调用block时,它将接收已传输的当前字节数,以及可传输字节的总数(定义为已传输的字节数加上待传输的字节数)。 当一个block被注册时,注册方法返回一个令牌对象。 可以在令牌上调用stop()方法来停止该特定块的通知。 如果块已经被注销,调用stop方法什么也不做。 注意,如果通知block永远不会再次运行(例如,因为会话已处于致命错误状态,或没有更多的进度信息报告),注册方法可能返回nil令牌。 有两种类型的块。 block可以配置为无限报告。 这些块将保持活动状态,除非用户明确停止,并且始终报告最新的可传输字节数。 这种类型的block可以用于控制网络指示器的UI,例如,改变颜色或仅当上传或下载正在发生时才出现。

block也可以配置为报告当前未完成工作的进度。这些block在它们被注册的时刻捕获可传输字节的数量,并且总是报告相对于该值的进度。 一旦传输的字节数达到或超过该初始值,块将自动取消注册自身。 例如,这种类型的block可以用于控制进度条,其在用户登录时跟踪同步的Realm的初始下载的进度,使他们知道拷贝到本地之前有多长时间。

Access Control

Realm Mobile Platform提供灵活的访问控制机制,以指定允许哪些用户与哪些Realm文件进行同步。 例如,这可以用于创建多个用户写入同一个领域的协作应用程序。 它还可以用于在发布者/订阅者场景中共享数据,其中单个写入用户与具有读取权限的许多用户共享数据。 有三个方向的控制给定Realm的访问级别(权限):

  • mayRead 表示允许用户从Realm读取
  • mayWrite 表示用户被允许写入Realm
  • mayManage 表示允许用户更改Realm的权限

除非明确修改权限,否则只有Realm的所有者才能访问它。 唯一的例外是管理员用户:他们总是被授予对服务器上所有域的所有权限。 有关访问控制的详细信息,请参阅Access Control上的通用Realm Object Server文档。

Management Realm

所有访问级别管理操作都可以通过写入Management Realm来执行。 Management Realm可以像常规同步Realm一样写入或读取。 但是,Realm对象服务器专门设计为对此Realm的更改做出反应。 权限更改对象可以添加到此Realm以修改Realm文件的访问控制设置。 要获取给定用户的管理域,请调用SyncUser.managementRealm()方法。

Modifying Permissions

要修改Realm文件的访问控制设置,请将SyncPermissionChange对象添加到Management Realm。

要对同步用户管理的所有区域应用权限更改,请指定realmURL值为* 。 要对通过对象服务器授权的所有同步用户应用权限更改,请指定userID值为*。 一旦对象服务器处理了在SyncPermissionChange对象中编码的操作,它将设置该对象的statusstatusMessage属性。 为了通知权限更改操作的结果,只需像任何其他Realm对象一样观察权限更改对象(例如,使用KVO或集合通知)。 有关详细信息,请参阅通知。 以下示例演示如何通知应用程序权限更改操作的状态:

Logging

同步子系统支持许多日志记录级别,在开发应用程序时很有用。 可以通过将SyncManager单例的logLevel属性设置为所需的详细程度来选择这些选项:

日志记录级别在Realm对象服务器配置文档中描述。

Error reporting

某些与同步相关的API执行可能失败的异步操作。 这些API接受接受错误参数的完成Block; 如果错误参数传递的操作失败。 可以检查错误的更多细节。 强烈建议SyncManager单例上设置错误处理程序。 涉及全局同步子系统或特定会话(代表与服务器同步而打开的Realm)的错误将通过此错误处理程序进行报告。 当错误发生时,将使用表示错误的对象以及表示发生错误的会话(如果适用)的SyncSession对象调用错误处理程序。

Errors

Realm Mobile Platform错误由SyncError值表示,它们符合Swift Error协议。

Client Reset

如果Realm对象服务器崩溃并且必须从备份恢复,则应用程序可能需要对给定的同步Realm执行客户端重置。 这种可能发生在Realm的本地版本大于服务器上同一个Realm的版本(例如,如果应用程序在Realm对象服务器备份后进行更改,但这些更改未同步回来,则会发生此情况) 到服务器之前它崩溃,不得不恢复)。 客户端重置过程如下:创建本地Realm文件的备份副本,然后删除Realm文件。 下一次应用程序连接到Realm对象服务器并打开该Realm时,将下载一个新的副本。 在Realm对象服务器备份后但未同步到服务器的更改将保留在Realm的备份副本中,但在Realm重新下载时不会显示。 客户端重置的需要由发送错误指示到SyncManager的错误处理程序。 此错误由.clientResetError表示。 错误对象还将包含两个值:执行客户端重置过程后Realm文件的备份副本的位置,以及可调用以启动客户端重置过程的参数的无参block。 如果调用block来手动启动客户端重置过程,则在调用block之前,必须先对所涉及的Realm的所有实例进行invalidated和销毁。 请注意,Realm可能不会完全失效,即使所有对它的引用都被清除,直到包含它的自动释放池耗尽为止。 然而,这样做允许在客户端重置过程完成后立即重新打开Realm,允许同步恢复。 如果未调用该block,则在首次访问SyncManager单例时,客户端重置过程将在下一次启动应用程序后自动进行。 如果需要,应用程序有责任保留备份副本的位置,以便以后可以找到备份副本。 需要重置的Realm仍然可以写入和读取,但不会将后续更改同步到服务器,直到客户端重置完成并重新下载Realm为止。 非常重要的是,您的应用程序监听客户端重置错误,并且至少需要规定保存在触发客户端重置后创建或修改的用户数据,以便以后将其写回到重新下载的Realm的副本 。 可以通过在错误对象上调用SyncError.clientResetInfo()获取备份拷贝文件路径和重置启动block。 以下示例显示如何使用客户端重置API执行客户端重置:

有关Realm对象服务器如何处理客户端重置的更多信息,请参阅我们的服务器文档

Migrations

同步的Realms支持自动迁移,但是在进行更改时,模式版本号必须递增。 目前,仅支持附加的更改,例如向现有类添加类或属性。 永远不会调用自定义迁移block。

Conflict Resolution

冲突解决支持在Realm Object Server文档中描述。


发表评论