Дождитесь завершения нескольких операций синтаксического анализа NSXMLParser - PullRequest
0 голосов
/ 13 марта 2012

На экране входа в приложение после получения учетных данных от пользователя я выполняю серию операций синтаксического анализа. Я храню данные в хранилище Core Data, и у меня есть около 7 объектов, что означает, что мне нужно 7 различных операций разбора.

Я делаю разбор с Судчем;

[WService UserLogin:self withUsername:username andPassword:pwd action:@selector(handleLogin:)];

, где handleLogin - селектор, выполняющий синтаксический анализ. И если вход успешен, я вызываю все другие обработчики разбора внутри этого обработчика.

- (void)handleLogin:(id)value
{
if ([value isKindOfClass:[NSError class]]) {
    NSLog(@"nserror %@", value);
    [managedObjectContext rollback];
    abort();
}
else if ([value isKindOfClass:[SoapFault class]])
{
    NSLog(@"soap fault %@", value);
    abort();
}
else {
    XMLParser *parser = [[XMLParser alloc] init];
    self.user = [[parser parseUserFromXML:value] retain];
    [parser release];

    if(self.user.userID != 0) 
    {
        NSError *error;
        if (![self.managedObjectContext save:&error])
            NSLog(@"Error");
        else
        {
            //calling other handlers for other entities
            SudzcMyWebService *WService = [[SudzcMyWebService alloc] init];
            [WService pharmacyOfUser:self action:@selector(handlePharmacyOfUser:) intUserID:[user.userID intValue]];
            [WService allPharmacyOrder:self byUserID:[user.userID intValue] action:@selector(handlePharmacyOrders:)];
            [WService allPharmacyOrderDetail:self withUserID:[user.userID intValue] action:@selector(handlePharmacyOrderDetails:)];
            [WService allCampaign:self action:@selector(handleCampaigns:)];
            [WService allCampaignDetail:self action:@selector(handleCampaingDetails:)];
            [WService allChannel:self action:@selector(handleChannels:)];
             .....
            //some method finishing the parsing, but not with certainty. this is where i      need help
            [WService release];
        }
    }
    else
    {
        [activityIndicator stopAnimating];
        [self showMessageBox:@"Wrong password or username" title:@"Error"]; 
        [self.managedObjectContext rollback];
    }
}
}

Все эти обработчики работают в одной логике. Все нормально работает нормально. НО, когда что-то идет не так, как, скажем, приложение закрывается в середине синтаксического анализа или один из них не выполнен, приложение пытается открыться и вылетает (NSException) из-за отсутствия данных.

То, что я хотел бы сделать, это сказать приложению (вроде) подождать, пока все синтаксический анализ будет выполнен безопасно (потому что порядок выполнения селекторов (обработчиков) является случайным, я думаю) и все обработчики возвращают некоторый положительный результат. Если нет, то сбросьте постоянное сохранение / удаление существующих неполных объектов и перезапустите.

РЕДАКТИРОВАТЬ: когда все селекторы завершат работу, я хотел бы вызвать метод, который поймет, заполнено ли хранилище или нет, в зависимости от результатов, поступающих от этих селекторов, и будет действовать соответственно.

Как мне это сделать? NSOperationQueue или NSThread или что-то еще?

Заранее спасибо,

Эрен

1 Ответ

0 голосов
/ 13 марта 2012

Используйте NSUserDefaults для сохранения состояния программы / состояния задачи.Если приложение дает сбой, оно может проверить информацию о состоянии и реагировать так, как должно.

Вот простой пример того, как сохранить состояние:

// load standardUserDefaults
NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];  
// save if operation is finished
[prefs setBool:YES forKey:@"operationOnefinished"];
// sync prefs
[prefs synchronize];

Для вызова [prefs synchronize]; не требуется, потому что он вызывается автоматически через определенные промежутки времени.Но так как вы упомянули, что ваше приложение иногда дает сбой, лучше вызвать этот метод, чтобы мгновенно сохранить изменения.

Получение состояний:

// load standardUserDefaults
NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; 
// Getting state
BOOL operationOnefinished = [prefs stringForKey:@"operationOnefinished"];
...