Swift 领域默认同步文件
学习如何使用Realm移动平台。 我构建了一个小的iOS应用程序,它成功地将数据保存到服务器,并且数据在不同的设备上保持一致。该应用程序非常类似于 我可以从Realm Browser Mac应用程序中打开同步URL,并且我可以实时看到发生的更改。这就是我被卡住的地方:我试图查看本地领域文件中的更改,但是Swift 领域默认同步文件,swift,realm,realm-mobile-platform,Swift,Realm,Realm Mobile Platform,学习如何使用Realm移动平台。 我构建了一个小的iOS应用程序,它成功地将数据保存到服务器,并且数据在不同的设备上保持一致。该应用程序非常类似于 我可以从Realm Browser Mac应用程序中打开同步URL,并且我可以实时看到发生的更改。这就是我被卡住的地方:我试图查看本地领域文件中的更改,但是 print(self.realm.configuration.fileURL)返回nil print(Realm.Configuration.defaultConfiguration.fileU
print(self.realm.configuration.fileURL)
返回nil
print(Realm.Configuration.defaultConfiguration.fileURL)
是一个空文件
这是我的代码:
SyncUser.logIn(with: cloudKitCredentials, server: serverURL) { user, error in
guard let user = user else {
fatalError(String(describing: error))
}
DispatchQueue.main.async {
// Open Realm
let configuration = Realm.Configuration(
syncConfiguration: SyncConfiguration(
user: user,
realmURL: URL(string: "realm://myIPaddress/~/realmtasks")!)
)
self.realm = try! Realm(configuration: configuration)
// Show initial tasks
func updateList() {
self.items = Array(self.realm.objects(Row.self))
self.tableView.reloadData()
}
updateList()
print(self.realm.configuration.fileURL)
//returns nil
print(Realm.Configuration.defaultConfiguration.fileURL)
// I can open the file, but it's empty
// Notify us when Realm changes
self.notificationToken = self.realm.addNotificationBlock { _ in
updateList()
}
}
我测试这个的原因是,我可以从文件而不是服务器加载数据。因此:(a)只有在(b)当用户离线时数据可用时,才会调用登录 当您首次登录时,域自动将用户存储在密钥链中。然后,您可以通过
SyncUser.currentUser
属性检索它,并使用它打开您的领域,即使您处于脱机状态。但是,如果您注销该用户,则无法脱机使用它
使用syncConfiguration
时,realm.configuration.fileURL
不可用
在这种情况下:
SyncUser.logIn
仅一次// First launch
if launchedBefore == false {
setupRealm()
// All other launches
} else if launchedBefore == true {
let user = SyncUser.current!
openRealm(forUser: user)
}
openRealm(forUser:SyncUser)
与前面代码中的整个调度块基本相同
setupRealm()
也可以调用它来清理代码:
SyncUser.logIn(with: cloudKitCredentials, server: serverURL) { user, error in
guard let user = user else {
fatalError(String(describing: error))
}
self.openRealm(forUser: user)
}
你能提供坠机的详细情况吗?例如,如何复制它等?显然,设备脱机时无法进行同步,但是,您仍然可以访问脱机前同步的数据。进行初始用户身份验证时,应用程序需要在线。@teotwaki我似乎没有正确地表达我的问题。对不起。换言之:我的印象是,使用ROS将创建镜像的磁盘域文件。在进一步实验之后,我创建了一个领域文件,它将驻留在设备上,然后每当发生更改时,将更改推送到服务器上的另一个领域文件。服务器上的域用于备份,而磁盘上的文件是主要的脱机文件。我不确定这是否是好的/坏的做法,但我会在实验完成后发布我的实验以获得反馈。非常感谢您的回复。这里没有“服务器上的领域”的概念。您总是处理本地文件,即使是查询/修改。如果文件已启用同步,则其历史记录将在服务器上复制,从而允许其他客户端下载历史记录并在本地重新组装域。实际上,您正在做与ROS手动提供的相同的事情。好的!中止我的实验。如果您使用
syncURL
打开域,则会出现这种情况。很抱歉,我没有完全理解。当前,default.realm
为空。在我使用SyncUser.currentUser
后,它是否会自动填充?在这种情况下,正确的打开方式是什么?@Jalal您正在为要打开的领域指定一个URI,因此文件名将不同于default.Realm
default.realm
仅在使用默认构造函数时使用(即:let realm=realm()
)。请注意,打开同步域时,本地文件的位置对您隐藏。您不应该试图手动访问它。@teotwaki哇,谢谢!您的评论帮助我了解了我的测试方法是如何错误的。