Быстрая ошибка: доступ к области из неверного потока - PullRequest
0 голосов
/ 09 октября 2019

Я пытаюсь использовать библиотеку Realm для сохранения данных в моем приложении. Тем не менее, я продолжаю сталкиваться с тем же кодом ошибки: «Доступ к области из неправильного потока». Я попытался решить эту проблему, создав Очередь отправки, специфичную для Realm, и поместив в нее все вызовы Realm.

Вот как сейчас выглядит мой класс RealmManager:

import Foundation
import RealmSwift

class RealmManager {

fileprivate static let Instance : RealmManager = RealmManager()

fileprivate var _realmDB : Realm!
fileprivate var _realmQueue : DispatchQueue!

class func RealmQueue() -> DispatchQueue {
    return Instance._realmQueue
}

class func Setup() {
    Instance._realmQueue = DispatchQueue(label: "realm")
    Instance._realmQueue.async {
        do {
            Instance._realmDB = try Realm()
        } catch {
            print("Error connecting to Realm DB")
        }
    } 
}

class func saveObjectArray(_ objects: [Object]) {

    Instance._realmQueue.async {
        do {
            try Instance._realmDB.write {
                for obj in objects {
                    Instance._realmDB.add(obj, update: .all)
                }
            }
        } catch {
            print("Error Saving Objects")
        }
    }
}

class func fetch(_ type: Int) -> [Object] {

    if let realm = Instance._realmDB {
        let results = realm.objects(Squeak.self).filter("type = \(type)")
        var returnArray : [Object] = []
        for r in results {
            returnArray.append(r)
        }

        return returnArray
    }
    return []
}

Я вызываю Setup () внутри didFinishLaunchingWithOptions для создания очереди Realm и экземпляра Realb Db.

Я получаю код ошибки внутри saveObjectArray по адресу:

try Instance._realmDB.write { }

Это кажетсяпросто из-за моего непонимания требований потоков в Realm. Я был бы признателен за любое понимание этого вопроса или направление отсюда.

1 Ответ

1 голос
/ 09 октября 2019

Эта проблема заключается в том, что вы извлекаете данные своего Царства из другого потока, чем вы его сохраняете.

Чтобы исправить ошибку, код в fetch также должен быть запущен в созданном вами потоке Realm.

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

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