Я новичок в CoreData, и я пытаюсь создать простое приложение.iOS: Синхронизация доступа к CoreData
Предположим, у меня есть функция:
func saveEntry(entry: Entry) {
let moc = NSManagedObjectContext(concurrencyType: .NSPrivateQueueConcurrencyType)
moc.parentContext = savingContext
moc.pefrormBlockAndWait {
// find if MOC has entry
// if not => create
// else => update
// saving logic here
}
}
может представить проблему: если я называю saveEntry
из двух потоков, передавая ту же запись будет дублировать его. Поэтому я добавил серийный очереди на мой DB адаптер и делать в следующем порядке:
func saveEntry(entry: Entry) {
dispatch_sync(serialDbQueue) { // (1)
let moc = NSManagedObjectContext(concurrencyType: .NSPrivateQueueConcurrencyType)
moc.parentContext = savingContext
moc.pefrormBlockAndWait { // (2)
// find if MOC has entry
// if not => create
// else => update
// saving logic here
}
}
}
И это работает отлично, пока я не хотел бы добавить еще одну функцию интерфейса:
func saveEntries(entries: [Entry]) {
dispatch_sync(serialDbQueue) { // (3)
let moc = NSManagedObjectContext(concurrencyType: .NSPrivateQueueConcurrencyType)
moc.parentContext = savingContext
moc.pefrormBlockAndWait {
entries.forEach { saveEntry($0) }
}
}
}
А теперь я имеют тупик: 1 будет вызываться в serialDbQueue и ждать завершения сохранения. 2 будет вызываться в частной очереди и будет ждать 3. И 3 ждет 1.
Итак, каков правильный способ обработки синхронизирующего доступа? Насколько я понимаю, небезопасно сохранять один MOC и выполнять его с сохранением по причинам, описанным здесь: http://saulmora.com/coredata/magicalrecord/2013/09/15/why-contextforcurrentthread-doesn-t-work-in-magicalrecord.html
Вы уверены, что необходима очередность очереди? Почему включение двух операций с помощью 'performBlockAndWait' вызывает проблему для вас, если вы выполняете свою проверку опрокидывания внутри этого блока? – Jonah
@ Jonah да, я. Если я запустил все со значком MOC - все в порядке. Но, как вы видите, 'saveEntry' создает MOC для каждого вызова. Итак, у вас будут параллельные операции – user1284151
К сожалению, я должен был внимательно прочитать. Вместо последовательной очереди для создания многих mocs, почему бы не разделить moc, который будет действовать как эта очередь? – Jonah