Как мне принудительно загрузить представление после выбора UITableView?

#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

    });
});