У меня создано несколько NSInvocationOperations и добавлено в NSOperationQueue. Два из этих NSInvocationOperations создают множество объектов одного и того же родительского класса (Country и City, в котором находится подкласс Location). Это в основном пошло хорошо, за исключением того, что я заметил, что изменения в одной модели или другую похожа на кого-то.Где создать NSManagedObjectContext для NSInvocationOperation
Глядя на магазин (используя программу 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 вызывает нагрузку:) ...
NSInvocationOperation *countryInvocationOperation = [[NSInvocationOperation alloc] initWithTarget:[Country class] selector:@selector(firstRun) object:nil];
[operationQueue addOperation:countryInvocationOperation];
Есть ли проблемы с созданием MOC в селекторе, который вызывается? Я бы хотел, чтобы это было, поскольку MOC привязан к потоку, на котором он создан. Я думаю, что любые указатели относительно того, где я иду, ошибочны.
Это тот же «adHocManagedObjectContext», который используется во всех операциях? Это будет проблемой, если операции выполняются параллельно, поскольку MOC не является потокобезопасным. –
@MartinR Привет, я добавил этот код. Я создаю новый MOC с тем же постоянным координатором магазина с каждым вызовом. – rob5408
У вас настройка MOC выглядит хорошо для меня (она создается в потоке). не могли бы вы рассказать о характере вашей проблемы, что вы подразумеваете под созданным классом A, а затем созданием класса B? есть ли отсутствующие предметы? (не забудьте удалить наблюдателя). –