Я создаю объект области в swift 4 и пытаюсь наблюдать за его изменениями согласно последней документации.
Объект области:
import Foundation
import RealmSwift
class Thing: Object{
@objc dynamic var id = UUID().uuidString
@objc dynamic var descriptionText: String = "xyxyx"
override static func primaryKey() -> String? {
return "id"
}
Remote Realm
extension Realm {
static func sharedDataRealm(callback: @escaping (Realm?, Swift.Error?) -> Void) {
SyncUser.logIn(with: Constants.syncCredentials, server: Constants.remoteAuthServer) { (remoteUser, error) in
if let user = remoteUser {
let sharedConfig = user.configuration(realmURL: Constants.remoteSharedRealmServer, fullSynchronization: true)
Realm.asyncOpen(configuration: sharedConfig, callback: callback)
} else {
callback(nil, error)
}
}
}
}
Уровень базы данных
class Database {
static let shared: Database = Database()
private init(){}
func saveThing(thing: Thing){
Realm.sharedDataRealm(callback: { (remoteRealm, error) in
if let realm = remoteRealm {
do { try realm.write { realm.add(thing, update: true)}
} catch {
print("error \(error)")
return
}
}
})
}
func updateText(onThing: Thing){
Realm.sharedDataRealm(callback: { (remoteRealm, error) in
if let realm = remoteRealm {
do { try realm.write { onThing.descriptionText = "\(arc4random())"}
} catch {
print("*** error \(error)")
return
}
}
})
}
}
Код проблемного наблюдателя:
let thing = Thing()
Database.shared.saveThing(thing: thing)
_ = thing.observe { (change) in
switch change {
case .change(let properties):
for property in properties {
print("property \(property.name) has new value \(property.newValue as! String)")
}
case .error(let error):
print(" an error occured: \(error)")
case . deleted:
print(" thing was deleted")
}
}
Другой код наблюдателя (с добавленной задержкой ..)
override func viewDidLoad() {
super.viewDidLoad()
var thing = Thing()
print ("*** created \(thing.descriptionText)")
Database.shared.saveThing(thing: thing)
DispatchQueue.main.asyncAfter(deadline: .now() + .milliseconds(5000)) {
_ = thing.observe { (change) in
switch change {
case .change(let properties):
for property in properties {
print("*** property \(property.name) has new value \(property.newValue as! String)")
}
case .error(let error):
print("*** an error occured: \(error)")
case . deleted:
print("*** situation was deleted")
}
}
}
Database.shared.updateText(onThing: thing)
}
«Проблемный код наблюдателя» завершается с «причиной:« Только объекты, управляемые уведомлениями поддержки поддержки Realm »в строке« thing.observe (..) ». «Другой код наблюдателя» не дает сбоя, потому что я ввожу задержку с момента добавления объекта в Царство и момента, когда я начинаю его наблюдать. Однако изменение объекта "вещь" по-прежнему не вызывает никакого уведомления, и печать нового свойства не запускается.
Из-за моего опыта в кодировании, мне НЕ нужно было жестко кодировать задержку, чтобы область могла фактически завершить создание (и управление операцией) моего объекта, в первую очередь. Я предполагаю, что эта задержка необходима, потому что я живу в регионе, который находится далеко от региона Царства, и, вероятно, есть некоторое отставание (?).
1. Есть ли лучший способ начать наблюдение за объектом после его создания без каких-либо задержек?
2. Почему при выполнении функции updateText () не появляется уведомление даже после того, как наблюдатель подключен? ..
Спасибо