在我的应用程序的登录屏幕上,在我从用户那里获得凭据后,我会执行一系列解析操作。我将数据保存在核心数据存储中,并且我有大约 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
由于丢失数据而崩溃 ()。
我想做的是告诉应用程序(有点)等到所有解析都安全完成(因为我猜选择器(处理程序)执行的顺序是随机的)并且所有处理程序都返回一些积极的结果。如果不是,则重置持久存储/删除现有的不完整实体并重新启动。
编辑:当所有选择器完成运行时,我想调用一个方法来了解商店是否已满,具体取决于来自这些选择器的结果并采取相应措施。
我该怎么办?NSOperationQueue
还是NSThread
别的什么?
提前致谢,
艾伦