одновременное сохранение из двух разных потоков в постоянное хранилище Core Data с уникальным идентификатором объекта - PullRequest
0 голосов
/ 15 декабря 2011

Я использую многопоточный загрузчик данных ядра.

У меня проблема с дублированием объектов при сохранении объектов с уникальным строковым атрибутом в Entity.

Если 2 потока загружаются с одного и того же URL-адреса одновременно (например, срабатывает таймер обновления и приложение выходит на передний план - поэтому пользователь вызывает метод обновления), я не могу проверить наличие объекта с уникальным значением атрибута в постоянном хранилище, поэтому объекты удваиваются .

Как я могу избежать дублирования объектов и каково лучшее решение с точки зрения производительности?

описание: (извините, я пока не могу опубликовать изображения) http://i.stack.imgur.com/yMBgQ.png

Ответы [ 2 ]

0 голосов
/ 15 декабря 2011

Другой подход заключается в выполнении загрузки / сохранения в NSOperation, и перед добавлением операции в очередь вы можете проверить, существует ли существующая операция для загрузки этого URL в NSOperationQueue.

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

0 голосов
/ 15 декабря 2011

Я сталкивался с этим раньше, и это сложная проблема.

Я решил ее, выполнив загрузку в отдельных фоновых потоках (так же, как вы делаете сейчас), но все операции записи данных кода происходят вглобальная очередь NSOperation с numConcurrentOperations, установленной в 1. Когда каждая фоновая загрузка была завершена, она создала NSOperation и поместила его в эту очередь.

Хорошо: Очень простая безопасность потока - NSOperationQueue гарантировал, что только один поток записывал вCoreData в любой точке.

Плохо: незначительный удар по производительности, потому что операции с Core Data работали последовательно, а не параллельно.Этого можно избежать, выполнив любые вычисления, необходимые для данных в фоновом потоке загрузки, и сделав как можно меньше операций с основными данными.

...