在我的应用程序的登录屏幕上,在我从用户获得凭据后,我进行了一系列解析操作。我将数据保存在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
)。
我想做的是告诉应用程序(等待)等待全部解析安全完成(因为选择器(处理程序)执行的顺序是随机的,我猜)和所有处理程序都返回一些积极的结果。如果没有,则重置持久存储/删除现有的不完整实体并重新启动。
编辑:当所有选择器都运行完毕后,我想调用一个方法来了解商店是否已满,具体取决于来自这些选择器的结果并采取相应措施。
我应该怎么做? NSOperationQueue
或NSThread
或其他什么?
提前致谢,
二连
答案 0 :(得分:0)
使用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"];