странное поведение viewDidAppear не вызывается

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

Я вижу, что viewDidLoad называется. В моем viewDidLoad нет кода. Странное поведение заключается в том, что иногда viewDidAppear: не вызывается, даже если я не менял код.

Причин конечно может быть много, но как отлаживать не знаю. Ищу способ узнать где зависает процесс в момент когда viewDidLoad закончено.

У кого-нибудь есть подсказка для меня или кто-нибудь знает, в чем может быть проблема? Я имею в виду, что иногда это работает, когда-то нет. Зависит ли viewDidAppear: от родительского представления или что-то не так в подпредставлении?

func showSubview() {

    let storyboard = UIStoryboard(name: "Main", bundle: nil)
    let vc = storyboard.instantiateViewControllerWithIdentifier("Subview") as! SubViewController
    self.presentViewController(vc, animated: true, completion: nil)
    //self.showViewController(vc, sender: self);
}

ОБНОВЛЕНИЕ Я вызываю showSubview из асинхронной задачи, думаю, это нехорошо. Как вы думаете и как мне лучше поступить? Есть ли обработчик компиляции с помощью dispatch_async ?

        dispatch_async(backgroundQueue, {
            dosomething_long();
            showSubview();
        })

ОБНОВЛЕНИЕ 2 Проблема в том, что я открываю подвид из фоновой задачи. Я не должен этого делать. Но вопрос в том, как я могу вызвать подвид, когда фоновая задача завершена. Есть ли обработчик завершения для вызова dispatch_async?

РЕШЕНО С ПОМОЩЬЮ ГЕНДАЛЬФА

Я глупый :-) Я должен вызвать подвид в основном потоке:

        dispatch_async(backgroundQueue, {
            dosomething_long();
            dispatch_async(dispatch_get_main_queue(), {
                showsubview();
            });
        })

person mcfly soft    schedule 29.10.2015    source источник
comment
вы печатаете журналы или проверяете это, сохраняя точку останова в методе? Потому что, если вы работаете в режиме release, точки останова могут не приостанавливать счетчик программ, как ожидалось.   -  person Gandalf    schedule 29.10.2015
comment
@Гэндальф. Я предполагаю, что проблема в режиме отладки, как вы подозревали. Я разрабатываю сейчас 1 год с xcode, но никогда не было такой проблемы. При остановке в методе didappear и продолжении это не удалось. Но он не останавливается ни в одной из моих точек останова, и я не мог видеть, где он остановился. Очень странно. По крайней мере, я рад, что проблема не в коде. Надеюсь, я вспомню, когда снова столкнусь с той же проблемой. Большое спасибо.   -  person mcfly soft    schedule 29.10.2015
comment
О, нет. Я просто снова перезапускаю приложение без режима отладки, и оно снова зависает. Несколько раз запускал приложение без режима отладки и все прошло. Ничего не менял, так как только тестирую. Я действительно не понимаю.   -  person mcfly soft    schedule 29.10.2015
comment
Может проблема в следующем? Я обновил свой вопрос.   -  person mcfly soft    schedule 29.10.2015
comment
Презентация и обновление пользовательского интерфейса должны выполняться в основном потоке. Проверьте это http://stackoverflow.com/questions/20590802/objective-c-trouble-updating-ui-on-main-thread, как это сделать.   -  person Gandalf    schedule 29.10.2015
comment
Думаю, проблема не в обновлении. Я делаю это в своем dosomething_long(); . Но мой длинный бегун должен работать в фоновом режиме, не так ли? Если да, может ли проблема заключаться в том, что я открываю свое подвид из фоновой задачи?   -  person mcfly soft    schedule 29.10.2015
comment
@Гэндальф. Извините, было непонимание с моей стороны. Ты прав. Мне просто нужно вызвать подвид в основном потоке. Я обновлю свой вопрос. Так что проблема решена. Большое спасибо за Вашу помощь. Если хотите, вы можете ответить, что я должен вызвать подвид в основном потоке, и я соглашусь.   -  person mcfly soft    schedule 29.10.2015


Ответы (2)


Очень очевидная причина, по которой счетчик программ не может войти в методы, заключается в том, что приложение может работать в режиме release.

Теперь, как мы видим после обновленного вопроса, это не причина, и операция пользовательского интерфейса происходит в background queue.
Согласно рекомендациям по разработке iOS, все операции пользовательского интерфейса должны выполняться в main thread, вы должны попробовать выполнить это в основном потоке вместо a background thread.
Попробуйте следующий код:

dispatch_async(backgroundQueue, {
    dosomething_long();
    dispatch_async(dispatch_get_main_queue(), {     
        showsubview();
    });
 })
person Gandalf    schedule 29.10.2015

Вопрос в том; представление создано раньше? Это вызвано повторным открытием приложения из фона? Вы можете проверить жизненный цикл здесь, и я думаю, что ваша проблема возникла из-за этого. iOS 7 — разница между viewDidLoad и viewDidAppear

person Berke Atmaca    schedule 29.10.2015