2016-01-08 3 views
0

Я хотел бы получить некоторое предложение для одновременного выполнения операций с основными данными в моем проекте. Мой проект работает с двух лет, так что он имеет множество реализаций, которые могут быть оптимизированы в зависимости от наличия новых функций в objectiveC. В основном, я ищу оптимизацию работы CoreData.Core Data Concurrency

В настоящее время большая часть операций с данными выполняется с использованием основного контекста управляемых объектов. Недавно я внедрил новую функцию для загрузки большого набора данных и вставки в базу данных с использованием основных данных после входа в систему. Это должно было выполняться параллельно с другими операциями в приложении. Теперь я понял, что код, написанный для основных данных, выполняется в основном потоке, потому что пользовательский интерфейс приложения блокируется во время операции coredata. Таким образом, я упомянул много блогов и узнал, что есть две стратегии, в которых можно достичь параллелизма между основными данными, уведомлениями с помощью множества контекстов и контекстов объектов, управляемых родителем/дочерним элементом.

Я пробовал родительскую/дочернюю стратегию, поскольку Apple не предпочитает другую стратегию. Но я получаю случайные сбои с исключением: «Коллекция была мутирована при перечислении» на executeFetchRequest. Это исключение начинается после реализации стратегии parent/child. Может ли кто-нибудь помочь мне решить эту проблему?

ответ

0

Да, я знаю, что не так много блогов, которые описывают эффективное использование основных данных в проекте, но, к счастью, я нашел один ... который указывает на вашу проблему правильно ... проверить здесь->https://medium.com/soundwave-stories/core-data-cffe22efe716#.3wcpw1ijo

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

если вы выборки данных в массиве или словаре затем сделать заявление изменения, как этот

NSDictionary *myDict = [[coreDataDectionary] mutableCopy]; 

Теперь выполните любую операцию над этим массивом или словарем, который вы выберете из базы данных, и не увидите никаких исключений. Надеюсь, это вам поможет.

0

Вы должны использовать completeBlock в своем коде. here - это учебное пособие и объяснение. Это позволит вам не замораживать ваше приложение пользовательского интерфейса, даже если ваша загрузка еще не завершена. выполнение кода будет продолжаться, даже если код внутри блока еще не закончен. Когда загрузка будет закончена, в блоке будет выполняться обратное действие.

0

Попробуйте это:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, NULL), ^{ 
    // DATA PROCESSING 

    dispatch_async(dispatch_get_main_queue(), ^{ 
     // UPDATE UI 
    }); 
} 
0

Использование стека это Ядро данных для минимизации интерфейса блокировки при импорте больших массивов данных:

  1. Один основной поток MOC со своим собственным PSC.
  2. Один фон MOC с его собственным PSC.
  3. Объединить изменения в основной поток MOC на фоне уведомлений сохранения MOC.

Да, вы можете - и должны использовать два независимых PSC (NSPersistentStoreCoordinator), указывающие на тот же файл .sqlite. Это сократит общее время блокировки только до замков, избегая блокировок на уровне PSC, поэтому общее время блокировки пользовательского интерфейса будет [SQLite write lock] + [main thread MOC read].

Вы можете использовать фоновый MOC с NSConfinementConcurrencyType в фоновом потоке или даже лучше в пределах NSOperation. - Мне было очень удобно обрабатывать данные и передавать их в Core Data в тот же поток.

Импорт в пакеты. Выберите размер партии эмпирически. Сбросьте фоновый MOC после каждого сохранения.

При обработке действительно больших наборов данных, содержащих сотни тысяч объектов, не используйте refreshObject:mergeChanges: с основной резьбой MOC при каждом сохранении. Он медленный и в конечном итоге будет потреблять всю доступную память. Перезагрузите свои FRC.

И о том, что «коллекция была мутирована при перечислении». Для многих отношений в Core Data используются изменчивые наборы, поэтому вам нужно сделать копию или лучше отсортировать их до NSArray s перед повторением.