UICollectionView 中来自领域同步配置的种子数据
Seed Data From Realm Sync Configuration in UICollectionView
所以,这是我的问题:
iOS 上领域的本地路径位于文档目录中。我可以用以下方式打开它们:
let realm = try! Realm()
打开同步领域是不同的,因为它们是通过 URL 定位的
https://realm.io/docs/swift/latest/#realms
我有一个带有 Results<Object>
的 UICollectionView,我可以通过在启动时写入 Realm 来呈现要在 AppDelegate 中调用的默认数据
单独的文件
class SetUpData {
// MARK: - Seed Realm
static func defaults() {
let realm = try! Realm()
guard realm.isEmpty else { return }
try! realm.write {
realm.add(List.self())
}
}
}
应用委托
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
// MARK: - Set Up Realm If Deleted
var config = Realm.Configuration()
config.deleteRealmIfMigrationNeeded = true
Realm.Configuration.defaultConfiguration = config
SetUpData.defaults()
return true
}
从这里,客户端 (iOS),我能够成功登录(滚动我自己的登录但值对应于领域对象服务器 (ROS) 管理员用户)并检索来自 List.cell
的默认值并开始将 "Lists" 写入我的应用程序。
但是,当我使用 Sync Configuration
参数配置我的领域时 打开同步领域需要一个已通过对象服务器验证并有权打开该领域的用户, 我在 cellForItemAtIndexPath
return lists.count
致命错误中合理地崩溃了:在展开可选值 时意外发现 nil 因为没有 return 的初始数据.
这是有道理的。但是我该怎么办?
我是否需要在默认配置中创建一个 Realm 文件并将其迁移到服务器?我尝试使用以下代码将我的配置更改为 App Delegate 中的 Sync 对象(这是我在 ListViewController
中使用的代码)。没有骰子。
private func setUpRealm() {
let username = "\(LoginViewController().username.text!)"
let password = "\(LoginViewController().password.text!)"
SyncUser.logIn(with: SyncCredentials.usernamePassword(username: username, password: password, register: true), server: URL(string: "http://000.000.000.000:9080")!) { (user, error) in
guard let user = user else {
fatalError(String(describing: error))
}
DispatchQueue.main.async {
let configuration = Realm.Configuration(syncConfiguration: SyncConfiguration(user: user, realmURL: URL(string: "realm://000.000.000.000:9080/~/realmList")!))
let realm = try! Realm(configuration: configuration)
self.lists = realm.objects(List.self).sorted(byKeyPath: "created", ascending: false)
self.notificationToken = self.lists.addNotificationBlock { [weak self] (changes: RealmCollectionChange) in
guard (self?.collectionView) != nil else { return }
switch changes {
case .initial:
self?.collectionView.reloadData()
break
case .update(_, let deletions, let insertions, let modifications):
self?.collectionView.performBatchUpdates({
self?.collectionView.insertItems(at: insertions.map({ IndexPath(row: [=13=], section: 0)}))
self?.collectionView.deleteItems(at: deletions.map({ IndexPath(row: [=13=], section: 0)}))
self?.collectionView.reloadItems(at: modifications.map({ IndexPath(row: [=13=], section: 0)}))
}, completion: nil)
break
case .error(let error):
print(error.localizedDescription)
break
}
}
}
}
}
Realm 当前不提供 API 将独立 Realm 转换为同步 Realm。如果我的理解是正确的,打开同步Realm时需要将种子Realm中的数据复制到同步Realm中。
所以,这是我的问题:
iOS 上领域的本地路径位于文档目录中。我可以用以下方式打开它们:
let realm = try! Realm()
打开同步领域是不同的,因为它们是通过 URL 定位的 https://realm.io/docs/swift/latest/#realms
我有一个带有 Results<Object>
的 UICollectionView,我可以通过在启动时写入 Realm 来呈现要在 AppDelegate 中调用的默认数据
单独的文件
class SetUpData {
// MARK: - Seed Realm
static func defaults() {
let realm = try! Realm()
guard realm.isEmpty else { return }
try! realm.write {
realm.add(List.self())
}
}
}
应用委托
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
// MARK: - Set Up Realm If Deleted
var config = Realm.Configuration()
config.deleteRealmIfMigrationNeeded = true
Realm.Configuration.defaultConfiguration = config
SetUpData.defaults()
return true
}
从这里,客户端 (iOS),我能够成功登录(滚动我自己的登录但值对应于领域对象服务器 (ROS) 管理员用户)并检索来自 List.cell
的默认值并开始将 "Lists" 写入我的应用程序。
但是,当我使用 Sync Configuration
参数配置我的领域时 打开同步领域需要一个已通过对象服务器验证并有权打开该领域的用户, 我在 cellForItemAtIndexPath
return lists.count
致命错误中合理地崩溃了:在展开可选值 时意外发现 nil 因为没有 return 的初始数据.
这是有道理的。但是我该怎么办?
我是否需要在默认配置中创建一个 Realm 文件并将其迁移到服务器?我尝试使用以下代码将我的配置更改为 App Delegate 中的 Sync 对象(这是我在 ListViewController
中使用的代码)。没有骰子。
private func setUpRealm() {
let username = "\(LoginViewController().username.text!)"
let password = "\(LoginViewController().password.text!)"
SyncUser.logIn(with: SyncCredentials.usernamePassword(username: username, password: password, register: true), server: URL(string: "http://000.000.000.000:9080")!) { (user, error) in
guard let user = user else {
fatalError(String(describing: error))
}
DispatchQueue.main.async {
let configuration = Realm.Configuration(syncConfiguration: SyncConfiguration(user: user, realmURL: URL(string: "realm://000.000.000.000:9080/~/realmList")!))
let realm = try! Realm(configuration: configuration)
self.lists = realm.objects(List.self).sorted(byKeyPath: "created", ascending: false)
self.notificationToken = self.lists.addNotificationBlock { [weak self] (changes: RealmCollectionChange) in
guard (self?.collectionView) != nil else { return }
switch changes {
case .initial:
self?.collectionView.reloadData()
break
case .update(_, let deletions, let insertions, let modifications):
self?.collectionView.performBatchUpdates({
self?.collectionView.insertItems(at: insertions.map({ IndexPath(row: [=13=], section: 0)}))
self?.collectionView.deleteItems(at: deletions.map({ IndexPath(row: [=13=], section: 0)}))
self?.collectionView.reloadItems(at: modifications.map({ IndexPath(row: [=13=], section: 0)}))
}, completion: nil)
break
case .error(let error):
print(error.localizedDescription)
break
}
}
}
}
}
Realm 当前不提供 API 将独立 Realm 转换为同步 Realm。如果我的理解是正确的,打开同步Realm时需要将种子Realm中的数据复制到同步Realm中。