доступ к Царству swift из неверной ветки - PullRequest
0 голосов
/ 11 июля 2019

Попытка обновить объект области, но получаю ошибку - доступ к области осуществляется из неверного потока, можете ли вы мне помочь? как это исправить?

var objectsArray: Results<BankHistoryRealm> {
    get {
        return dbHistoryRealm.getArray()
    }
}

override func viewWillAppear(_ animated: Bool) {
    let realm = try! Realm()
    dbHistoryRealm.realm = realm
    objectsArray.forEach { (match) in
        all.append(match)
    }
    all.forEach { (match) in
            UserNetwork.get(from: match.from, 
                            to: match.to, 
                            match_id: match.match_id, 
                            completion: { (isSuccess, info) in // get info from server

                    DispatchQueue.main.async { // trying without. but get the same error
                        do {
                            let isCorrect = self.isCorrect(match: match, info: info)
                            self.updateValue(match: match)
                            self.dbHistoryRealm.update(ofType: match, 
                                                       value: isCorrect as AnyObject, 
                                                       key: "isCorrect")

                        }catch {
                        }
                    }
            }
     }
}

пробовал без DispatchQueue.main.async, но получаю ту же ошибку

1 Ответ

0 голосов
/ 11 июля 2019

Для согласованности такие вещи, как конкретный экземпляр Realm, должны быть адресованы из одного потока.Он покрыт документами .Вы можете достичь этого следующими способами:

  • , заполнив новый поток и выполнив в нем все вызовы Realm.Конечно, вам нужно сначала сконфигурировать runloop для этого потока.

  • , создав выделенную очередь отправки (последовательный подходит лучше, я полагаю?) И снова выполнив все вызовы Realm в этомqueue.

Для обоих способов вам нужно написать какую-нибудь оболочку / координатор, которая будет использовать выделенный поток / очередь внутри.Эта обертка будет содержать экземпляр Realm внутри, поэтому у вас не будет его внутри вашего viewWillAppear метода, что само по себе не очень хорошая идея.

Если вы хотите создать разные экземпляры Realm для каждого потока,Вы можете прочитать раздел «Передача экземпляров между потоками» в документации, о которой я упоминал ранее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...