Объекты Core Data перебираются на фоновой очереди
let context = persistentContainer.viewContext
let orders = try context.fetch(Order.fetchRequest())
DispatchQueue.global().async {
var total: Decimal = 0
for order in orders {
total += order.total // объекты пришли из viewContext
}
print(total)
}
Подсчёт вынесли в фон, чтобы не блокировать интерфейс. Что не так с этим кодом?
- Чтение безопасно, ограничение на потоки распространяется только на запись и сохранение
- NSManagedObject доступен только с очереди своего контекста: нужен perform или передача objectID
- Достаточно задать контексту mergePolicy — после этого объекты становятся потокобезопасными
- Проблема только в производительности: fetch на главном потоке блокирует интерфейс, а сам цикл безопасен
