Подтвердить что ты не робот

Анимации UIViewController перестают работать

Мое приложение отлично работает в iOS6, но в неустановленной будущей версии iOS, которую я не могу назвать по причинам NDA, все анимации перехода UIViewController перестают работать. Новые взгляды сразу появляются на месте. Я не уверен, является ли эта неопределенная будущая версия iOS причиной, поскольку я видел, как это иногда случается в iOS6.

Иногда анимация начинает работать некоторое время, а затем останавливается вскоре после этого, заставляя меня думать о какой-то проблеме с предупреждением о памяти, но мое приложение в большинстве случаев использует довольно разумную ~ 125 МБ ОЗУ. Может ли кто-нибудь предложить какие-либо советы или вещи для расследования?

4b9b3361

Ответ 1

Описанное поведение всегда существовало: если вы работаете над фоновыми потоками, а затем вызывают и методы UIKit, то чаще всего обновление будет задерживаться странным образом.

Из-за этого вы всегда должны dispatch_async в главной очереди обновлять интерфейс.

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

Чтобы поймать их, я построил метод, который проверяет некоторые методы UIKit, чтобы проверить, вызваны ли они в основном потоке. Это позволяет вам остановиться на символической точке останова, когда вы забыли отправить обратно в основную очередь.

https://github.com/Cocoanetics/DTFoundation/blob/develop/Core/Source/iOS/Debug/UIView%2BDTDebug.m

Ответ 2

Хорошее обходное решение от форумов Apple dev по этой проблеме:

Сделайте это:

[UIView setAnimationsEnabled:YES] 

И анимация снова начнет работать. Я подозреваю, что это либо ошибка iOS7, либо где-то в моем коде анимация, либо запуск UIViewController происходит в фоновом потоке, что приводит к остановке анимации. Вероятно, не связано с неопределенной будущей версией iOS.

Ответ 3

Эта проблема, по-видимому, вызвана тем, что вы делаете материал UIKit в фоновом потоке. У меня есть кеш pre-render, полный NSOperations, который предоставляет UIViews для UIImages для кэширования вывода. Это, похоже, отлично работает в iOS6, но, вероятно, немного пересекает линию. Мне нужно будет заменить эту функциональность тем, что визуализирует изображения и текст в графическом буфере, а не использует UIViews и UILabels.

Ответ 4

Все, что вам нужно сделать, - это ухватить основную очередь при обновлении пользовательского интерфейса при получении ответа от API. Для обновления пользовательского интерфейса по умолчанию используется основная очередь, но она не на 100% эффективна. Если вы должны убедиться, что пользовательский интерфейс обновляется только в основном потоке, и способ сделать это следующим образом:

DispatchQueue.main.async{
  //UI related code eg: 
  self.label.text = "abc" 
  self.button.setTitle("xyz",.normal)
  self.tableView.reloadData()
}

Если вы не улавливаете анимацию основного потока, может работать или не работать. Но если вы используете анимацию основного потока, то определенно будет работать.

Исправить код при обновлении пользовательского интерфейса при ответе api:

Alamofire.getApiCall(paramaters: parameters, completion:{
  response in 
  // UI related code.
  DispatchQueue.main.async{
    self.label.text = "abc" 
    self.button.setTitle("xyz",.normal)
    self.tableView.reloadData()
  }
})

Неправильный код, который может привести к остановке анимации и привести к возникновению странных сбоев:

  Alamofire.getApiCall(paramaters: parameters, completion:{
  response in 
  // UI related code.
    self.label.text = "abc" 
    self.button.setTitle("xyz",.normal)
    self.tableView.reloadData()
})