У меня есть UIBarButtonItem под названием «Обновить данные». Когда пользователь нажимает на нее, приложение должно обновить свои данные. При нажатии этой кнопки запускаются веб-службы и переносятся данные xml, и они имеют порядок 30000-40000 записей. Поэтому, чтобы пользовательский интерфейс не зависал, я написал фоновый поток и загрузил его туда.
- (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");
}
});
}
Как вы можете видеть, появляется представление предупреждений. Я нажимаю ОК, и коробка все еще "почернела" и висит на экране. А через 7-8 секунд окошко исчезает, и начинается анимация индикатора активности. Моя цель - получить что-то подобное. 1. Пользователь нажимает кнопку обновления данных. 2.Появится вид предупреждений. 3. Пользователь нажимает ОК. 4. Поле предупреждения исчезает, и сразу же начинает работать фоновый поток, и я вижу, что индикатор активности работает / анимируется.
Пользователь будет знать, что нужно подождать, пока индикатор активности будет анимирован. Итак, как мне заставить приложение начинать анимацию сразу после того, как пользователь нажимает «ОК», и предупреждение ОК не будет затемнено. Понятно? Если вам нужна дополнительная информация, спросите. Спасибо
РЕДАКТИРОВАТЬ: на этом экране работает фоновый поток, когда он загружается в первый раз за этот день. Перед этим есть экран. На нем у меня есть кнопка продолжения, и нажатие на нее запускает фоновый поток, который делает то же самое, что и здесь. Я не убиваю его или что-то в этом роде.
РЕДАКТИРОВАТЬ 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");
}