На экране входа в мое приложение после получения учетных данных от пользователя я выполняю ряд операций синтаксического анализа. Я храню данные в хранилище 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
или что-то еще?
Заранее спасибо,
Эрен