Я читал большое количество блогов по основным процессам обработки данных ядра, но я не понимаю, как лучше всего управлять задачами BG Core Data, стреляя одновременно и уведомляя об этом к основному потоку MOC в неопределенное время.Несколько NSManagedObjectContexts - предотвращение условий гонки и взаимоблокировок
Я знаю, вы должны иметь 1 NSManagedObjectContext
за NSThread
и что подписавшись на NSManagedObjectContextDidSaveNotification
наряду с использованием [context performBlock
я получаю некоторые хорошее асинхронное выполнение задач.
То есть, я бегу много задач асинхронно, я не 100% знаю, когда некоторые будут перекрываться, и я наблюдал гонки условий в виде ...
- BG MOC 1 оттеняет на его задачи
- BG MOC 2 оттеняет на его задачи
- BG MOC 2 завершает задачу и сохранить уведомление отправляется
- BG MOC 1 завершает задачи, а затем вытирает BG MOC 2s изменения
Мой общий вопрос Как я могу решить условия гонки в нескольких MOC?
Если правильное поведение должно иметь 1 MOC на поток .. Могу ли я создать Ивар NSThread и поставить все мои Core Data работают на него? Таким образом, у меня может быть один MOC, который работает синхронно с самим собой?
Я читал, что NSLock может быть решением, позволяющим избежать доступа к определенному коду из нескольких потоков одновременно. Но я не знаю, что я должен блокировать? Метод «Сохранить контекст»? Постоянный магазин (кажется, делает многопоточность бессмысленным)?
И наконец, могу ли я пометить/номер/имя моего MOC? если я знаю, что другие задачи запущены, я могу хранить уведомления и обрабатывать их в порядке их создания, чтобы гарантировать, что данные не будут перезаписаны? Рекомендуется
Отличный ответ, большое спасибо. Я не использовал 'NSOperation' /' NSOperationQueue' в моей реализации, поэтому я начну там. Рад получить твердую НЕТ во всех моих изворотливых идеях. – Magoo
«NSOperation или аналогичная конструкция. Вы создаете MOC вместо этой конструкции», должен ли быть «внутри этой конструкции»? –
Спасибо @IanDundas, исправлено. –