0

У меня создано несколько 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 привязан к потоку, на котором он создан. Я думаю, что любые указатели относительно того, где я иду, ошибочны.

+0

Это тот же «adHocManagedObjectContext», который используется во всех операциях? Это будет проблемой, если операции выполняются параллельно, поскольку MOC не является потокобезопасным. –

+0

@MartinR Привет, я добавил этот код. Я создаю новый MOC с тем же постоянным координатором магазина с каждым вызовом. – rob5408

+0

У вас настройка MOC выглядит хорошо для меня (она создается в потоке). не могли бы вы рассказать о характере вашей проблемы, что вы подразумеваете под созданным классом A, а затем созданием класса B? есть ли отсутствующие предметы? (не забудьте удалить наблюдателя). –

ответ

0

Я не уверен, что понимаю вашу проблему (у вас отсутствуют страны или города ?, у вас есть неправильный порядок? Приведите пример «clobbered»).

Что касается вашего вопроса:

Есть ли какие-либо проблемы с созданием MOC в селекторе, который будучи вызывается?

Нет, проблем нет. в документации указывается, что он должен быть создан в потоке, который вы собираетесь использовать (start и main - это методы, которые будут выполняться в рабочем потоке). следовательно, NSInvocationOperation будет запускать ваш метод в потоке операций, и вы можете создать свой MOC там без забот.

+0

Иногда я увижу один Город, созданный, а затем 200 стран. Если я удалю приложение и повторю попытку, я увижу, возможно, одну страну и 200 городов. Поэтому я знаю, что код, который я написал, чтобы пропустить JSON и создать новые объекты.Просто после создания группы городов они не сохраняются после слияния контекста. Я должен иметь возможность создавать объекты одного и того же типа (базового) в разных потоках и иметь их все в магазине, когда все будет сказано и сделано, правильно? Я буду продолжать использовать его и видеть, появляется ли шаблон. – rob5408

+0

Я не знаю никакой проблемы с клонированием данных при сохранении контекста. Я бы посоветовал вам печатать объекты, которые вы создаете в 'createObjectWithObject: inManagedObjectContext:' во время создания, и перед сохранением (вставленные, удаленные, обновленные коллекции контекста) и убедитесь, что все объекты, которые вы создали, были перед сохранением. если до сохранения вы видите все объекты в контексте, и они все еще отсутствуют в БД (и без ошибок), у вас может возникнуть проблема. –

+0

Привет, Дэн, я провел это, может быть, еще 50 раз прошлой ночью, и не мог получить то, что я видел на днях. Не уверен, что изменилось. Спасибо за вашу помощь! – rob5408