Дождитесь завершения нескольких операций синтаксического анализа NSXMLParser.

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

Я делаю разбор с Sudcz;

[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) из-за отсутствия данных.

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

EDIT: когда все селекторы закончат работу, я хотел бы вызвать метод, который поймет, заполнен ли магазин или нет, в зависимости от результатов, полученных от этих селекторов, и действовать соответствующим образом.

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

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

Эрен


person Eren Beşel    schedule 13.03.2012    source источник


Ответы (1)


Используйте 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"];
person dom    schedule 13.03.2012
comment
Спасибо за ответ. Но, возможно, я не ясно выразил свою точку зрения, мне действительно нужно дождаться завершения набора селекторов. так как я не знаю их порядка выполнения, я не могу быть уверен, все ли они выступили или нет. когда все они закончатся, я хотел бы вызвать метод, который будет проверять, заполнен ли магазин или нет, в зависимости от результатов, полученных от этих селекторов. - person Eren Beşel; 13.03.2012
comment
@ErenBeşel Затем вам следует реализовать некоторые тесты, которые будут выполняться при запуске вашего приложения, чтобы убедиться, что данные готовы к использованию. - person dom; 13.03.2012
comment
Ваш ответ дал мне понимание в конце концов. Я принимаю это и благодарю тебя, приятель. - person Eren Beşel; 13.03.2012