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