0

在我的应用程序的登录屏幕上,在我从用户那里获得凭据后,我会执行一系列解析操作。我将数据保存在核心数据存储中,并且我有大约 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别的什么?

提前致谢,

艾伦

4

1 回答 1

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"];
于 2012-03-13T14:24:50.020 回答