2016-03-03 4 views
-1

У меня есть AViewController и вы хотите нажать BViewController на стек навигационной панели, но BViewController имеет много пользовательского интерфейса, который занимает две секунды для рендеринга.Предварительный просмотр контроллера представления перед вызовом pushViewController

Можно ли предварительно визуализировать пользовательский интерфейс BViewController, прежде чем он будет нажат так, чтобы он отображался сразу?

+0

Не могли бы вы перефразировать свой вопрос и, возможно, добавить дополнительную информацию. Непонятно, что вы просите. – MyGGaN

+0

er, при нажатии на BviewControl и bviewcontrol необходимо загрузить много пользовательского интерфейса. Для загрузки пользовательского интерфейса требуется не менее 2 секунд. Я хочу знать, как загрузить comleted UI прямо сейчас. Когда вы нажимаете на Bviewcontrol – user6011981

+0

У вашего второго контроллера просмотра есть сетевой вызов? если да, то сколько? это синхронно или асинхронно? –

ответ

1

Никакой пользовательский интерфейс не должен требовать 2 секунд, чтобы его толкали, так что у вас действительно есть проблема.

У вас есть различные решения:

  1. Push-контроллер без данных, загруженных и начать загрузку немедленно, в то время показывая кок. Например, если у вас есть табличное представление, оно будет пустым, а прядильщик будет вращаться посредине экрана с маленьким надписью «Загрузка ...». Когда это будет сделано, вы заполняете табличное представление и показываете его.

Таким образом, ваш пользователь знает, что происходит, и он может решить вернуться, если захочет, или просто подождать 2 секунды.

  1. Если действительно необходимо, чтобы данные загружались по мере того, как пользователь толкает, вы можете загрузить его до того, как он вытолкнет контроллер. Но это действительно зависит от данных. Если это подробный вид элемента, вы не можете загрузить все элементы на всякий случай. Если это представление всегда одно и то же, вы можете загрузить его, когда AViewController закончит загрузку, что даст вам время, необходимое для загрузки, потому что пользователь, вероятно, останется вторым или двумя, прежде чем нажать BViewController. Этот метод, вероятно, не рекомендуется. Вы можете добиться того, что примерно так:

    BViewController *vc = [[BViewController alloc]init]; 
    // [vc viewDidLoad]; I'm not sure this is necessary 
    

Но серьезно не пойти на вариант 2, то, скорее всего, плохо для предварительной загрузки пользовательского интерфейса во многих многих случаях. Данные предварительной загрузки являются общими, но UI, я так не думаю.

  1. Вы можете уменьшить объем данных, которые хотите загрузить. Убедитесь, что ваши изображения достаточно сжаты (на маленьком экране вам не нужны 4K-изображения), убедитесь, что вы не загружаете полную базу данных, когда вам действительно нужен один объект, и т. Д. Вы должны загружать только то, что пользователь собирается видеть, а не «все». Опять же, если вы сделали это правильно, это должно быть уже хорошо.

Я настоятельно рекомендую вам попробовать вариант 3 сильный текст, убедитесь, что все мало и именно то, что вам нужно. Если да, то перейти на вариант 1.

Не забывайте: пользователь знает, чего хочет, вы этого не делаете. Если он не хочет ждать две секунды, он должен уметь возвращаться, пока он вращается. Ему НИКОГДА не придется ждать две секунды, и ваше приложение никогда не должно быть висит.

EDIT: Вы сказали, что вам нужно загрузить «Много пользовательского интерфейса». Не могли бы вы показать нам/сказать нам, какой пользовательский интерфейс занимает две секунды для загрузки? У меня были довольно сложные взгляды (и я имею в виду очень сложные), и пользовательский интерфейс так долго не загружался.

+0

, спасибо, Это всего лишь один пример. Я просто хочу знать, как уменьшить нагрузку на время bViewController, – user6011981

0

Сделайте ваши посылки в bViewController в фоновом режиме.

- (void)viewDidLoad { 
     [super viewDidLoad]; 

     dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void){ 
      //Background Thread 
      // Do your loading stuff here 

      dispatch_async(dispatch_get_main_queue(), ^(void){ 
       //Run your UI Updates 
      }); 
     }); 
    } 
+0

если я хочу загрузить UI comleted прямо сейчас. Когда вы нажимаете на bViewcontroller, как это сделать? – user6011981

+0

Что значит? –

+0

Поскольку bViewController имеет много пользовательского интерфейса, я хочу нажать на bViewController, и теперь будет отображаться пользовательский интерфейс bViewController – user6011981

Смежные вопросы