У меня есть UIBarButtonItem под названием «Обновить данные». Когда пользователь нажимает на нее, приложение должно обновить свои данные. Что происходит при нажатии этой кнопки, запускаются веб-службы и приводятся данные xml, и они имеют порядок 30000-40000 записей. Поэтому, чтобы предотвратить зависание пользовательского интерфейса, я написал фоновый поток и сделал там загрузку.UIAlertview висит, когда поток в фоновом режиме загружает данные
- (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.User нажимает кнопку обновления данных. 2. Появляется окно просмотра. 3.User нажимает OK. окно 4.Alert исчезает и сразу начинает работать фоновый поток, и я вижу индикатор активности/анимацию.
Пользователь будет знать, ждать, пока индикатор активности оживляет. Итак, как я могу заставить приложение начать анимацию сразу после того, как пользователь нажимает «ОК», а предупреждение не будет почернено. Я понимаю? Если вам нужна дополнительная информация, спросите пожалуйста. Спасибо
EDIT: Этот экран имеет фоновый поток, работающий над ним, когда он загружает первый раз за этот день. Перед этим есть экран. На нем у меня есть кнопка продолжения и щелчок, запускающий фоновый поток, который делает то же самое, что и здесь. Я не убиваю его или что-то еще.
EDIT 2:
- (void)refreshDataAction
{
NSLog(@"Refresh Data");
self.txtCustomerSearch.text [email protected]"";
[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");
}
Метод getAllCustomerValues является синхронным или нет? –
@GeorgeSachin. Как мне это узнать? – RookieAppler
@GeorgeSachin. Поскольку он выполняется в очереди async, он будет выполняться асинхронно. – rmaddy