с новым годом.
Я работаю с приложением, в котором данные сохраняются с использованием основных данных. Приложение содержит модуль календаря, и пользователю разрешено переходить назад / вперед между датами двумя кнопками (nextDay, previousDay). Каждый день содержит информацию о сомах, которую я получаю из веб-сервиса, и поэтому я хотел бы получить большую часть данных (следующие 14 дней) в фоновом режиме, пока пользователи используют календарь.
Так вот мой подход:
Данные первого дня выбираются основным потоком и сохраняются в постоянном хранилище и представляются пользователю. Затем NSThread запускается в фоновом режиме с новыми данными выборки nsmanagedcontext, и когда все данные выбираются, они сохраняются в постоянном хранилище.
Однако, пока работает этот фоновый поток, у пользователя есть возможность перейти к следующему или предыдущему дню, и если данных нет, основной поток извлечет данные и сохранит их в постоянном хранилище. Это дает возможность обоим потокам извлекать одни и те же данные и сохранять их в постоянном хранилище. Но, как я понял, такой подход не должен быть проблемой, так как я использую новый nsmanangedcontext для фонового потока.
Но иногда я получаю следующую ошибку Операция не может быть завершена. (Ошибка какао 133020.) , и тогда основной поток не может сохранить в постоянном хранилище.
Я пытался использовать только один nsmanagedcontext, совместно используемый потоками, но это иногда приводит к тому, что один из потоков останавливается и никогда не движется дальше.
Я провел много часов, читая различные форумы / блоги, и надеюсь, что кто-нибудь сможет помочь или направить меня в правильном направлении.
привет
решено с помощью:
Ошибка, которую я получал, произошла из-за ошибок при объединении при сохранении в моем постоянном хранилище. Я смог решить ее, изменив политику слияния при сохранении. Следующий фрагмент показывает мой метод для инициализации nsmanagedcontext. Где жирным шрифтом показаны настройки политики. Я могу сделать это, потому что данные, которые я получаю, одинаковы, независимо от того, является ли это основным потоком или фоновым потоком.
- (NSManagedObjectContext *)managedObjectContext
{
NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
if (coordinator != nil)
{
__managedObjectContext = [[NSManagedObjectContext alloc] init];
[__managedObjectContext setPersistentStoreCoordinator:coordinator];
**[__managedObjectContext setMergePolicy:NSOverwriteMergePolicy];**
}
return __managedObjectContext;
}