#iphone #objective-c #multithreading #uiactivityindicatorview
#iPhone #objective-c #многопоточность #uiactivityindicatorview
Вопрос:
Вот фрагмент кода, с которым у меня возникли проблемы:
-(IBAction) nextRegister {
[DSBezelActivityView newActivityViewForView:self.view.superview];
previousPosition = (NSInteger *) currentPosition;
currentPosition = (NSInteger *) ((int)currentPosition (int) 1 );
[currentRegistry updateOnServer];
[self loadNewRegisterInfos];
[DSBezelActivityView removeViewAnimated:YES];
}
Строка за строкой, вот что делает (или должен делать) этот фрагмент:
Показать DSBezelActivityView (из этого:http://www.dejal.com/developer/dsactivityview )
Предыдущая позиция получает фактическую позицию (поскольку это приведет к переходу к следующей)
Следующий — текущий 1;
Обновляет запись на сервере (это занимает ~ 1 секунду)
Загружает новую запись и отображает на экране (это занимает максимум 1-3 секунды)
Эта строка удаляет DSBezelActivityView.
Итак, когда я нажимаю кнопку, чтобы загрузить следующую запись, предполагается, что она отображает ActivityView, загружает данные, затем обновляет экран и выпускает ActivityView. Но что происходит: приложение зависает на 3 секунды, показывает и закрывает представление активности менее чем за секунду, а затем завершает процедуру. Что не так?
[Отредактировано] Устранено! Это проблема с потоком. Разделить на 4 метода:
-(IBAction) nextRegister {
[NSThread detachNewThreadSelector:@selector(openActivityView) toTarget:self withObject:nil];
[self viewNextRegister];
[self removeView];
}
-(void)viewNextRegister{
previousPosition = (NSInteger *) currentPosition;
currentPosition = (NSInteger *) ((int)currentPosition (int) 1 );
[currentRegister setScoreOnServer];
// [NSThread detachNewThreadSelector:@selector(loadRegisterInfo) toTarget:self withObject:nil];
[self loadRegisterInfo];
}
-(void)openActivityView{
[DSBezelActivityView newActivityViewForView:self.view.superview];
}
-(void)removeView {
[DSBezelActivityView removeViewAnimated:YES];
}
Ответ №1:
Вместо отдельного потока, который может вызвать проблемы, если вы не будете осторожны, вы также можете сделать:
-(void) doNextRegister {
previousPosition = (NSInteger *) currentPosition;
currentPosition = (NSInteger *) ((int)currentPosition (int) 1 );
[currentRegistry updateOnServer];
[self loadNewRegisterInfos];
[DSBezelActivityView removeViewAnimated:YES];
}
-(IBAction) nextRegister {
[DSBezelActivityView newActivityViewForView:self.view.superview];
[self performSelector:@selector(doNextRegister) withObject:nil afterDelay:0.0];
}
Комментарии:
1. Фактически, оба этих селектора требуют опроса с авторелизом, поэтому «угроза» одинакова с потоками или без них.