等到多个NSXMLParser解析操作完成

时间:2012-03-13 14:08:11

标签: ios selector nsthread nsoperationqueue sudzc

在我的应用程序的登录屏幕上,在我从用户获得凭据后,我进行了一系列解析操作。我将数据保存在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)。

我想做的是告诉应用程序(等待)等待全部解析安全完成(因为选择器(处理程序)执行的顺序是随机的,我猜)和所有处理程序都返回一些积极的结果。如果没有,则重置持久存储/删除现有的不完整实体并重新启动。

编辑:当所有选择器都运行完毕后,我想调用一个方法来了解商店是否已满,具体取决于来自这些选择器的结果并采取相应措施。

我应该怎么做? NSOperationQueueNSThread或其他什么?

提前致谢,

二连

1 个答案:

答案 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"];