Core Data and Concurrency, решение 2, какой путь мне использовать? - PullRequest
1 голос
/ 01 июня 2011

Я получаю некоторые данные с сервера, и мне нужно их проанализировать. Затем некоторые результаты анализа могут быть сохранены с использованием основных данных.

теперь это мой код:

- (void)receiveSomeMessage:(NSString *)message
{
    [self performSelectorInBackground:@selector(parseMessage:) withObject:message];
}

- (void) parseMessage:(NSString *)message
{
    NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
    NSManagedObjectContext *BGMOC =  [[NSManagedObjectContext alloc] init];
    [BGMOC setPersistentStoreCoordinator:[self.appDelegate persistentStoreCoordinator]];

    //parse it
    //write to core data 

    NSNotificationCenter *dnc = [NSNotificationCenter defaultCenter];
    [dnc addObserver:self selector:@selector(addContextDidSave:)    name:NSManagedObjectContextDidSaveNotification object:BGMOC];

    NSError *saveError;
        if (![BGMOC save:&saveError]) {
            //handle the error
        }
    [dnc removeObserver:self name:NSManagedObjectContextDidSaveNotification object:BGMOC];
}

- (void)addContextDidSave:(NSNotification*)saveNotification {

// Merging changes causes the fetched results controller to update its results
[self.appDelegate.managedObjectContext   mergeChangesFromContextDidSaveNotification:saveNotification];
}

Кажется, это работает.

Но в документе Apple говорится: сохранение в фоновом потоке подвержено ошибкам.

Так что мне интересно, эта работа:

-(void) parseMessage:(NSString *)message 

{ NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
   //parse it and save it to a dictionary
    [self performSelectorOnMainThread:@selector(saveToCoreData:) withObject:dictionary waitUntilDone:YES];
 [pool release];
}

После разбора сообщения я упаковываю его в словарь и передаю его основному потоку и выполняю там основные данные. Это работает? если работает, то лучше?

Спасибо.

1 Ответ

3 голосов
/ 01 июня 2011

Документы Apple не говорят, что сохранение в фоновом режиме подвержено технологическим ошибкам, они подразумевают, что программисты склонны к ошибкам при сохранениив фоновом режиме:

Асинхронные очереди и потоки не препятствуют выходу приложения.(В частности, все потоки на основе NSThread «отсоединены» - см. Документацию для pthread для получения полной информации - и процесс выполняется только до тех пор, пока не завершатся все неотсоединенные потоки.) Поэтому, если вы выполняете операцию сохранения в фоновом потокеон может быть убит до того, как сможет завершить.Если вам нужно сохранить в фоновом потоке, вы должны написать дополнительный код, чтобы основной поток не позволял завершать работу приложения до тех пор, пока не будет завершена вся операция сохранения.

Перевод: «При выходе программистдолжен уделять особое внимание состоянию сохранения фоновых операций, и в большинстве случаев они этого не делают ".

...