2013-07-22 2 views
2

Я пытаюсь загрузить данные с web-services и вставить в UITableViewController.Загрузить UITableViewController перед веб-сервисами

Я могу сделать это успешно, но проблема в том, что он будет «зависать» в течение короткого периода времени при первом UIView, прежде чем отправляться в UITableViewController, когда он загружает web-services из Интернета. Он будет hang дольше, если скорость интернета будет медленной.

Любой шанс, что я могу показать пустой UITableViewController сначала знаком «Загрузка», а затем только начать извлечение данных из web-services и перезагрузить таблицу?

В настоящее время я поставил функцию, используемую для вызова web-services в

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    self._completeList = [[NSMutableArray alloc]init]; 
    self._completeList = [self getListFromWebServices]; 
} 

ответ

5

Лучшие подход как мое предложение, вы должны использовать Grand Central Dispatch (GCD) как ржали, как например

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 

     //code for webservices calling 

     dispatch_async(dispatch_get_main_queue(), ^{ 

      //reload you tableview here 
      [self.tableview reloadData]; 
     }); 
    }); 
0

Вы бы хранить данные в массиве и в методе numberOfRows с использованием array.count.

Вы должны выделить init array в viewDidLoad и запустить вторичный поток для загрузки данных из сети.

[self performSelectorInBackground:@selector(getListFromWebServices) withObject:nil]; 

Когда загрузка завершена, перезагрузите таблицу вызовов в основной теме.

[self.table performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:NO]; 

Так что перед загрузкой DataArray счетчика будет равен нулю, и вы получите пустую таблицу

0

Самым простым решением было бы переместить эти две строки кода в - (Недействительными) viewDidAppear:

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    self._completeList = [[NSMutableArray alloc]init]; 
} 

- (void)viewDidAppear:(BOOL)animated { 
    [super viewDidAppear:animated]; 
    self._completeList = [self getListFromWebServices]; 
    // Assuming that [self getListFromWebServices] is a blocking call. 
    [self.tableView reloadData]; 
} 

Но я бы рекомендовал загрузить асинхр данных с помощью НОД:

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { 
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 
    if (self) { 
     _completeList = [[NSMutableArray alloc] init]; 
     dispatch_sync(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
     self._completeList = [self getListFromWebServices]; 
     dispatch_async(dispatch_get_main_queue(), ^{ 
      [self.tableView reloadData]; 
     }); 
     }); 
    } 
    return self; 
} 
0

Дополнение к @Durgaprasasad Ans:

dispatch_async(backgroundQueue, ^{ 
     aResult = [self getListFromWebServices]; 

     dispatch_async(dispatch_get_main_queue(), ^{ 
      [self updateMyUIWithResult: aResult]; 
     });  
    }); 
Смежные вопросы