Исключение неправильного потока объекта Realm Server

У меня было приложение, в котором объекты области управлялись локально, как это

import Foundation
import RealmSwift

class Patient: Object {

    static var realm: Realm?
    dynamic var name = ""

    convenience init(name: String, save: Bool = false) {
        self.init()
        self.name = name
        if save() {
            self.save
        }
    }


    func save() {
        try! Patient.realm?.write {
            Patient.realm?.add(self, update: true)
        }
    }

    static func getAllPatients() -> Results<Patient>? {
        return Patient.realm?.objects(Patient.self)
    }

}

Когда я попытался преобразовать приведенный выше код для синхронизации с сервером объектов Realm, я получил ошибку потока при попытке передать экземпляр области, переданный из метода входа в мой класс.

static func userLogin(onCompletion: @escaping (Realm) -> Void) {
    let serverURL = URL(string: "http://127.0.0.1:9080")!
    let credentials = SyncCredentials.usernamePassword(username: "test@test", password: "test")
    SyncUser.logIn(with: credentials, server: serverURL) {
        user, error in

        if let user = user {
            let syncServerURL = URL(string: "realm://localhost:9080/~/test")!
            let config = Realm.Configuration(syncConfiguration: SyncConfiguration(user: user, realmURL: syncServerURL))
            let realm = try! Realm(configuration: config)
            onCompletion(realm)
        } else if _ = error {
        }
    }

} 

и здесь, чтобы получить экземпляр области

userLogin() { realm in
        Patient.realm = realm
    }

Теперь, когда я использую этот новый Patient.realm в своих функциях класса (getAllPatients), я получаю incorrect thread exception

Любой возможный способ передать экземпляр области из userLogin в мой класс, не вызывая этого исключения потока? Если я помещаю свои запросы в функцию входа в систему, означает ли это, что мне нужно входить в систему, синхронизировать каждый раз, когда мне нужно что-то получить или отредактировать базу данных?


person Anya Alstreim    schedule 11.01.2017    source источник
comment
Я думаю, что наличие экземпляра Realm внутри вашей модели данных кажется довольно проблематичным недостатком дизайна.   -  person EpicPandaForce    schedule 11.01.2017


Ответы (1)


В вашей функции входа в систему вы должны хранить объект Realm.Configuration, созданный вошедшим в систему пользователем, и использовать его для создания экземпляра Realm по мере необходимости, а не пытаться сохранить объект Realm. Экземпляры Realm зависят от потока, а объекты конфигурации — нет.

person Thomas Goyne    schedule 11.01.2017