2015-12-11 1 views
0

Ниже приведен код обижая:UI не загружается, код по-прежнему работает

override func viewDidAppear() { 
    super.viewDidAppear() 
    doit("dave") 
} 

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

Но пользовательский интерфейс никогда не загружается. Значок приложения остается в доке, но нет «открытой точки», как я ее называю.

Если я выберу функцию, все будет отлично.

Я не могу думать, что код в функции doit должен иметь значение, поскольку представление должно появиться до того, как оно сможет даже запуститься. Я также пробовал это в viewDidLayout и viewDidLoad с теми же результатами.

Для удовольствия я это сделал:

override func viewDidLoad() { 
    super.viewDidLoad() 
    print(1) 


    // Do any additional setup after loading the view. 
} 

override func viewDidLayout() { 
    super.viewDidLayout() 
    print(2) 
} 

Оба заявления печати без зрения либо появляющегося.

Любая помощь приветствуется.

ответ

0

Если doit работает очень долго, ваша проблема в том, что вы блокируете основной поток. Все, что связано с пользовательским интерфейсом, происходит там, но этого не может быть, потому что ваша функция doit по-прежнему занята, и пользовательский интерфейс должен подождать, пока он не закончится. Ваш пользовательский интерфейс не появляется, потому что viewDidLoad никогда не возвращается, и он должен вернуться до того, как могут возникнуть другие задачи с основными потоками.

Долгосрочные функции должны быть установлены на другие резьбы. Apple предлагает множество способов сделать это. Для этого могут быть GCD (т. Е. dispatch_async и друзья) или NSOperation.