Выполнение вызова на сервер в viewDidLoad

Я довольно новичок в разработке iOS, и у меня возникла следующая проблема. Мне нужно заполнить UITableView данными, полученными с сервера.

Я делаю этот вызов, используя AFNetworking . Я хочу показать «загрузочный просмотр» с помощью SVProgressHUD и я делаю следующее:

 -(void) viewDidLoad{ [super viewDidLoad]; [SVProgressHUD showWithMaskType:SVProgressHUDMaskTypeGradient]; [[MyServer sharedManager] fetchFromServerwithCompletionHandler:^(NSArray *elements, BOOL error) { _elements = elements; [_elementsTableView reloadData]; [SVProgressHUD dismiss]; }]; } 

Я получаю правильный ответ с сервера, но показ прогресса не отображается. Звонок на сервер занимает несколько секунд, поэтому есть время для загрузки hud view, но ничего не происходит.

Я выполняю вызов в viewDidLoad потому что мне нужно, чтобы вызов был выполнен, как только будет загружено представление, и я хочу позвонить ему только один раз.

Если я переместю этот блок кода в viewDidAppear то будет достигнут прогресс, но этот метод будет вызываться каждый раз, когда отображается представление, и я не хочу этого …

Большое спасибо!

Проблема заключается не в том, что сетевой вызов не выполняется, если выполняется в viewDidLoad (потому что это подходящее место для этого), а в том, что попытка добавить SVProgressHUD в viewDidLoad не будет работать, потому что это слишком рано в процессе построения view для SVProgressHUD чтобы выяснить, куда помещать HUD.

Одним простым решением было бы иметь viewDidLoad отложить вызов этого, чтобы дать пользовательскому интерфейсу возможность перейти к состоянию, которое SVProgressHUD может правильно разместить в иерархии представлений. Как ни глупо, как кажется, вы можете просто отправить код обратно в основной цикл, что дает UI шанс догнать:

 - (void)viewDidLoad { [super viewDidLoad]; dispatch_async(dispatch_get_main_queue(), ^{ [SVProgressHUD showWithMaskType:SVProgressHUDMaskTypeGradient]; [[MyServer sharedManager] fetchFromServerwithCompletionHandler:^(NSArray *elements, BOOL error) { _elements = elements; [_elementsTableView reloadData]; [SVProgressHUD dismiss]; }]; }); } 

Уловкой может быть использование NSUserDefaults для сохранения значения типа @ "serverAlreadyCalled" и проверка на viewDidAppear, если вы вызывали сервер раньше. пример:

 -(viewDidAppear){ NSUserDefaults* defaults = [NSUserDefaults standardDefaults]; if ([defaults valueForKey:@"serverAlreadyCalled"] == nil) { [SVProgressHUD showWithMaskType:SVProgressHUDMaskTypeGradient]; [[MyServer sharedManager] fetchFromServerwithCompletionHandler:^(NSArray *elements, BOOL error) { _elements = elements; [defaults setValue:@"YES" forKey:@"serverAlreadyCalled"]; [_elementsTableView reloadData]; [SVProgressHUD dismiss]; }]; } } 

Не забудьте установить nil на ваш ключ @ "serverAlreadyCalled", прежде чем ваше приложение закончит работу.

Возможно, это не лучшее решение, но может сделать трюк. Надеюсь, поможет.

  • instantiateViewControllerWithIdentifier, похоже, вызывает viewdidload
  • Как ViewController знает, что он сосредоточен на iOS? Как "viewDidLoad"
  • Странное поведение, выполняемое MPMoviePlayerController в viewDidLoad
  • ios - Программно закодированный UIButton не отображается на моем представлении
  • LandscapeOrientation при запуске метода didload в объекте c
  • Как вызвать метод, когда приложение переходит на передний план из фона
  • iOS - передача имени отправителя (кнопки) в addSubview
  • viewDidLoad вызывается до выполнения всего метода init
  • метод init и метод типа viewDidLoad
  • О методах viewController «viewDidLoad» и «viewWillAppear»
  • Как настроить атрибуты titletext для панели UINavigation только для одного контроллера?
  • Давайте будем гением компьютера.