「データの更新」という UIBarButtonItem があります。ユーザーがクリックすると、アプリはデータを更新する必要があります。そのボタンをクリックすると、Web サービスが起動され、xml データが取り込まれ、それらは 30000 ~ 40000 レコードのオーダーになります。UI がハングしないようにするために、バックグラウンド スレッドを作成し、そこにロードしました。
- (void)refreshDataAction
{
NSLog(@"Refresh Data");
//Put up an alert box indicating user to wait while data is loading.
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Data is Loading"
message:@"Please wait while data is being refreshed."
delegate:self
cancelButtonTitle:@"OK"
otherButtonTitles:nil, nil];
alert.tag = 10;
[alert show];
}
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
NSLog(@"hit in clickedbuttonatindex alertview at 259");
self.refreshActIndicator.hidden = NO;
[self.refreshActIndicator startAnimating];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,
(unsigned long)NULL), ^(void) {
[self getAllCustomerValues];
NSError *nwerror = nil;
if (![self.secondMOC save:&nwerror])
{
NSLog(@"209 Failed to save second MOC");
}
else
{
//NSLog(@"saved success");
}
});
}
ご覧のとおり、アラート ビューが表示されます。[OK] をクリックすると、ボックスは「黒くなった」ままで、画面にぶら下がっています。7 ~ 8 秒後にボックスが消え、アクティビティ インジケーターのアニメーションが開始されます。私の目標は、このようなものを手に入れることです。1.ユーザーがデータの更新ボタンをクリックします。2.アラートビューが表示されます。3. ユーザーが [OK] をクリックします。4. アラート ボックスが消え、すぐにバックグラウンド スレッドが動作し始め、アクティビティ インジケーターが動作/アニメーション表示されます。
ユーザーは、アクティビティ インジケーターがアニメーション化されている間、待機する必要があることがわかります。では、ユーザーが「OK」をクリックした直後にアプリのアニメーションを開始し、alertview OK が黒くならないようにするにはどうすればよいですか。よろしいですか?さらに詳しい情報が必要な場合は、お問い合わせください。ありがとう
編集: この画面には、その日の最初の読み込み時にバックグラウンド スレッドが動作しています。この前に画面があります。その上に続行ボタンがあり、クリックするとバックグラウンド スレッドが起動し、こことまったく同じことを実行します。
編集2:
- (void)refreshDataAction
{
NSLog(@"Refresh Data");
self.txtCustomerSearch.text =@"";
[self cleanUPPreviousLabels];
//Put up an alert box indicating user to wait while data is loading.
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Data is Loading"
message:@"Please wait while data is being refreshed."
delegate:self
cancelButtonTitle:@"OK"
otherButtonTitles:nil, nil];
//alert.tag = 10;
//[alert show];
[alert performSelectorOnMainThread:@selector(show) withObject:nil waitUntilDone:FALSE];
NSLog(@"hit in willpresenet alertview at 221");
self.refreshActIndicator.hidden = NO;
[self.refreshActIndicator startAnimating];
NSLog(@"Dispatching");
//Disable the view and all the other controls
self.txtCustomerSearch.userInteractionEnabled =NO;
self.txtCustomerSearch.enabled =NO;
self.btnSearch.enabled =NO;
self.btnSearch.userInteractionEnabled = NO;
self.scrollView.userInteractionEnabled = NO;
//self.view.userInteractionEnabled =NO;
self.chkButton.enabled = NO;
[self deletePreviousValues];
dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{
NSLog(@"Getting customer values");
[self getAllCustomerValues];
NSLog(@"Got customer values");
NSError *nwerror = nil;
if (![self.secondMOC save:&nwerror])
{
NSLog(@"209 Failed to save second MOC");
}
else
{
//NSLog(@"saved success");
}
self.txtCustomerSearch.userInteractionEnabled = YES;
self.txtCustomerSearch.enabled =YES;
self.btnSearch.enabled =YES;
self.btnSearch.userInteractionEnabled = YES;
self.scrollView.userInteractionEnabled = YES;
self.view.userInteractionEnabled =YES;
self.chkButton.enabled = YES;
[self.refreshActIndicator stopAnimating];
NSLog(@"Saved");
});
NSLog(@"Dispatched");
}