2016-04-08 2 views
3

последние 5 часов Я пытаюсь исправить эту ошибку. У меня два VC. Есть жест нажатия, который запускает segue в первом VC.Swift viewWillAppear задерживается

@IBAction func addMaterial(sender: AnyObject){ 
     dispatch_async(dispatch_get_main_queue()) { 
      self.performSegueWithIdentifier("addNewMaterialSegue", sender: self) 
     } 
    } 

Второй VC:

override func viewDidLoad() { 
    dispatch_async(dispatch_get_main_queue()) { 
     super.viewDidLoad() 
     print("viewDidLoad") 
    } 
} 


override func viewWillAppear(animated: Bool) { 
    print("viewWillAppear") 
    super.viewWillAppear(animated) 
} 

занимает около 5 secounds от viewDidLoad до viewWillAppear. Я знаю, что I'm not the first to ask this question, но я не нашел другого решения, чем «Создание и представление контроллера представления должно выполняться в основном потоке», и это не мое дело.

+12

Зачем вы писали dispatch_async в viewDidLoad? –

+0

Использует эту строку 'dispatch_async (dispatch_get_main_queue())' внутри viewDidLoad. – Tuhin

ответ

4

Удалите dispatch_async всюду в вашем примере кода. Вы уже находитесь в главной очереди.

EDIT:

Ну, я должен извиниться. Я пробовал ваш код, но не могу найти никаких проблем. На первый взгляд ваши вызовы dispatch_async, которые вы делаете уже в главной очереди, выглядят действительно подозрительными. И я все еще думаю, что их нужно удалить. Но они не вызывают проблем, которые вы испытываете. Вид открывается очень быстро, без каких-либо задержек, даже если вы отправляете вызовы в dispatch_async. Таким образом, должна быть другая проблема. Может быть, вы можете дать больше информации, больше кода или лучше всего: весь проект. Тогда должно быть легко найти проблемы.

Если вы не можете отдать проект, который вы могли бы сделать эту проверку:

print("Current thread \(NSThread.currentThread())") 

Место это на каждой записи каждого привлеченного функции. Давайте посмотрим, в каких случаях происходит тотальное событие.

+2

Вы должны подробно рассказать о том, почему это приведет к вызову 'viewWillAppear' позже. – Jojodmo

+0

Готово. Спасибо за напоминание. – Darko

6

Удалить dispatch_async.

Что вы говорите процессор с dispatch_async является

  • как вы сказали: да, пожалуйста, запустите его в главном потоке, поскольку это UI связанные вещи. Это хорошо.
  • async говорит: уважаемый процессор, просто продолжайте идти с тем, что еще нужно сделать - это может быть хорошо, поскольку любые вызовы вашего viewDidLoad, вероятно, тоже много других вещей, которые нужно делать
  • К сожалению, , однако, в процессе создания и отображения всего представления, все зависит друг от друга, понятно. если представление не загружается (через super.viewDidLoad()), то, конечно, VC также не может подготовить представление к появлению.
  • , наконец, dispatch_async может получить несколько приоритетов. Вы, скорее всего, не получите наивысший приоритет, если не укажете его явно. Таким образом, многие другие вещи будут приоритетными по вашим вызовам процессором.

Короче говоря, удалите dispatch_async, и ваша задержка исчезнет.

+0

Нет, это не так, я попробовал. (Смотри ниже) – Darko

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

  • Нет связанных вопросов^_^