Swift Realm - «RLMException», причина: «Изменяются только объекты, управляемые поддержкой Realm» - PullRequest
0 голосов
/ 07 ноября 2018

Я создаю объект области в 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 () не появляется уведомление даже после того, как наблюдатель подключен? ..
Спасибо

...