#objective-c #uitableview #uiactivityindicatorview
#objective-c #uitableview #uiactivityindicatorview
Вопрос:
Прямо сейчас у меня возникли проблемы с отображением режима загрузки. Процесс происходит следующим образом:
- Выберите строку в UITableView
- Извлеките UITableView из mainview
- Нажмите Loadingview в mainview
- Вызовите длинный метод, который использует запросы JSON
Проблема в том, что когда я выбираю строку в таблице, она приостанавливается там, пока все не будет завершено. Как мне обойти это?
Ответ №1:
Вы захотите загрузить данные в отдельный поток. Лично я бы перенес представление загрузки в основное представление, а затем создал новый поток, который загружает данные. После загрузки данных вы можете перейти обратно в поток пользовательского интерфейса, закрыть представление загрузки, а затем представить любое представление, в котором вы будете отображать свои данные.
Ваша реализация будет выглядеть примерно так:
// push loading view..
// spawn thread
[NSThread detachNewThreadSelector:@selector(loadData:) toTarget:self withObject:nil];
-(void)loadData:(id) obj {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
// load your data
[self performSelectorOnMainThread:@selector(updateUI:) withObject:data waitUntilDone:NO];
[pool release];
}
-(void)updateUI:(id)data {
// update the data
}
Ответ №2:
Используйте GCD и отправьте асинхронный запрос, когда запрос завершен, перейдите в основной поток и делайте то, что вы хотите.
//addProgressIndicator
__weak typeof(self) weakSelf = self;
dispatch_async(dispatch_get_global_queue(0, 0), ^{
//call your request. Here could be your call back too, depends to architecture of your code
NSDictionary *response = [WebService sendRequest];
dispatch_async(dispatch_get_main_queue(), ^{
//removeProgressIndicator
//do what you want after request is finished with your UI
});
});