Где создать 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 там без забот.

Другие вопросы по тегам