アプリのログイン画面で、ユーザーからクレデンシャルを取得した後、一連の解析操作を実行します。私はデータを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
または何か他のもの?
前もって感謝します、
エレン