Где создать NSManagedObjectContext для NSInvocationOperation
У меня есть несколько NSInvocationOperations, созданных и добавленных в NSOperationQueue. Два из этих NSInvocationOperations создают множество объектов одного и того же родительского класса (Страна и Город, у которого есть подкласс Location). В основном все прошло хорошо, за исключением того, что я заметил, что изменения в одной или другой модели немного засорены.
Глядя на магазин (используя программу sqlite), я вижу первый Город (всего, может быть, 200), а затем все Страны (опять, может быть, 200). Если я удаляю приложение и запускаю его снова, я вижу первую страну, а затем все города.
Я нажал на документы и заметил, что Apple предлагает настроить ваши MOC для каждого потока в методе запуска вашей NSOperation. Однако я не использую NSOperation, я использую NSInvocationOperation. Это на самом деле заставляет меня задаться вопросом, почему они предлагают создать ваш MOC в начале.
Это мой селектор для моей NSInvocationOperation...
+ (void)load:(NSString *)file
{
NSManagedObjectContext *managedObjectContext = [(OSSMAppDelegate *)[[UIApplication sharedApplication] delegate] adHocManagedObjectContext];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(mergeChanges:)
name:NSManagedObjectContextDidSaveNotification
object:managedObjectContext];
SBJsonParser *jsonParser = [[SBJsonParser alloc] init];
NSString *json = [[NSString alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:file ofType:@"json"]];
NSArray *objects = [[jsonParser objectWithString:json] valueForKeyPath:@"objects"];
for(NSDictionary *object in objects)
{
[self createObjectWithObject:object inManagedObjectContext:managedObjectContext];
}
NSError *error = nil;
[managedObjectContext save:&error];
}
... из приложения делегата...
- (NSManagedObjectContext *)adHocManagedObjectContext
{
NSManagedObjectContext *adHocManagedObjectContext = nil;
NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
if (coordinator != nil)
{
adHocManagedObjectContext = [[NSManagedObjectContext alloc] init];
[adHocManagedObjectContext setPersistentStoreCoordinator:coordinator];
[adHocManagedObjectContext setUndoManager:nil];
}
return adHocManagedObjectContext;
}
... затем куда-то еще (Примечание: firstRun вызывает load:)...
NSInvocationOperation *countryInvocationOperation = [[NSInvocationOperation alloc] initWithTarget:[Country class] selector:@selector(firstRun) object:nil];
[operationQueue addOperation:countryInvocationOperation];
Есть ли проблемы с созданием MOC в вызываемом селекторе? Я представляю, что это должно быть, поскольку MOC привязан к потоку, в котором он создан. Я предполагаю, что любые указатели относительно того, где я иду неправильно, полезны.
1 ответ
Я не уверен, что понимаю вашу проблему (у вас есть пропущенные страны или города? У вас неправильный порядок? Приведите пример "забитых").
Что касается вашего вопроса:
Есть ли проблемы с созданием MOC в вызываемом селекторе?
Нет, проблем нет. документация только говорит, что она должна быть создана в потоке, который вы собираетесь использовать (start
а также main
методы, которые будут выполняться в потоке операций). следовательно, NSInvocationOperation будет запускать ваш метод в потоке операций, и вы можете создать свой MOC там без забот.