Swift CoreData: NSPrivateQueueConcurrencyType для каких экземпляров?

#swift #multithreading

Вопрос:

У меня есть приложение для чата.

Данные поступают по сети в .async очереди и должны отображаться с интервалами в пользовательском интерфейсе.

Для меня работа с CoreData очень запутанна. Если я правильно понял, вы можете использовать контекст в разных потоках, однако это приводит к тому, что в обоих потоках содержатся разные данные.

Чтобы избежать каких-либо разветвлений в одном и том же контексте, я помещаю каждый вызов в .performAndWait блок. Это, однако, похоже, может замедлить представление данных в пользовательском интерфейсе в следующем случае:

Пользователь несколько месяцев держал свое приложение в автономном режиме, запускает приложение. Пользовательский интерфейс пытается извлечь чаты с помощью данных .performAndWait , в то время как сеть добавляет новые сообщения и новые чаты, с помощью .performAndWait которых, в свою очередь, пользовательский интерфейс ждет.

В идеальной реализации поток пользовательского интерфейса будет иметь некоторое разрешение для извлечения по текущему состоянию (чатов, их имен и последних сообщений и т. Д.), Прежде чем сетевой уровень сможет вставить новое содержимое в контекст, чтобы оба мира были несколько альтернативными. Заставить поток пользовательского интерфейса указывать другим потокам синхронизировать контекст, чтобы собрать последние данные в этот момент, звучит здорово, но если поток пользовательского интерфейса добавит команду в другой поток, он будет стоять в очереди в конце очереди и, следовательно, будет вызван только после того, как другой (сетевой) поток в любом случае завершит какие — либо манипуляции, что, в свою очередь, сделает все обсуждение бесполезным. Некоторая очередь LIFO для добавления обновлений пользовательского интерфейса каждые несколько секунд, вероятно, будет работать хорошо, но я чувствую, что слишком много думаю об этой проблеме.

Проще говоря, как бы я достиг фонового потока, постоянно передающего данные, и потока пользовательского интерфейса, извлекающего данные в любое заданное состояние, которое является самым последним состоянием на текущий момент времени, т. Е. Все, что фоновый поток только что обработал и добавил в базу данных.