0

アプリのログイン画面で、ユーザーからクレデンシャルを取得した後、一連の解析操作を実行します。私はデータをCoreDataストアに保持しており、約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];
    }
}
}

これらのハンドラーはすべて同じロジックで動作します。すべて正常に動作します。ただし、解析の途中でアプリがシャットダウンしたり、解析の1つが失敗したりするなどの問題が発生した場合、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 に答える