Swift Записывает огромные данные в область с помощью realm.add () или realm.create () - PullRequest
0 голосов
/ 18 сентября 2018

Мне нужно записать огромные данные (например, 200000 входных данных) в область, и я использовал realm.add () для записи данных в фоновом потоке. Но он получил сообщение об ошибке:

Завершение работы приложения из-за необработанного исключения «RLMException», причина: «Доступ к области из неверного потока.»

let cities = try decoder.decode([City].self, from: dataFromStream)
let dispatchQueue = DispatchQueue(label: "com.example.myApp.bg", qos: .background)
dispatchQueue.async {
    let myBackgroundRealm = try! Realm()
    myBackgroundRealm.beginWrite()

    for city in cities {
        myBackgroundRealm.add(city, update: false)
    }

    try! myBackgroundRealm.commitWrite()
}

Поэтому я перехожу на использование Realm.create (), и оно работает. Но я до сих пор не понимаю, в чем разница между Realm.create () и Realm.add () при записи больших данных.

let cities = try decoder.decode([City].self, from: data)
let dispatchQueue = DispatchQueue(label: "com.example.myApp.bg", qos: .background)
dispatchQueue.async {
    let myBackgroundRealm = try! Realm()

    for city in cities {
        try! myBackgroundRealm.write {
            myBackgroundRealm.create(City.self, value: city, update: false)
        }
    }
}

Ответы [ 2 ]

0 голосов
/ 18 сентября 2018

Не должно быть никакой разницы между добавлением с помощью 'add' и 'create'.Одна вещь, которую вы также изменили, это место, где вы открываете транзакцию (перед итерацией по городам или каждым циклом итерации).Каждый цикл является правильным способом, поэтому другие транзакции записи не ожидают вставки больших данных.Авария все еще интересна, кажется, что очередь с приоритетом фона решила выделить другой поток в середине транзакции, вызывая аварию, которая, как я думал, никогда не должна происходить.

0 голосов
/ 18 сентября 2018

При выполнении асинхронной записи в область вы должны инициализировать потокобезопасную ссылку и разрешить ссылку в фоновом потоке.Взято из документации королевства https://realm.io/docs/swift/latest/#passing-instances-across-threads

let person = Person(name: "Jane")
try! realm.write {
    realm.add(person)
}
let personRef = ThreadSafeReference(to: person)
DispatchQueue(label: "background").async {
    autoreleasepool {
        let realm = try! Realm()
        guard let person = realm.resolve(personRef) else {
            return // person was deleted
        }
        try! realm.write {
            person.name = "Jane Doe"
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...