Вступить в клуб →
средняявопросСеть, данные и конкурентность

Объекты 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 на главном потоке блокирует интерфейс, а сам цикл безопасен

🔒 Проверка ответа — для участников клуба

  • Проверка ответа
  • Подсказка, если застряли
  • Разбор с объяснением, почему так
  • Прогресс по всем задачам и виртуальные собеседования
Зарегистрироваться →

Регистрация занимает минуту

Другие задачи раздела