Animacje UIViewController przestają działać

Moja aplikacja działa dobrze w iOS6, ale w bliżej nieokreślonej nadchodzącej wersji iOS, której nie mogę wymienić z powodów NDA, wszystkie animacje przejścia przestają działać. Nowe widoki po prostu pojawiają się natychmiast. Nie jestem pewien, czy ta nieokreślona przyszła wersja iOS jest przyczyną, ponieważ widziałem, że zdarza się to od czasu do czasu w iOS6.

Czasami animacje zaczynają działać na chwilę, a następnie zatrzymują się krótko po tym, co sprawia, że myślę, że to jakiś problem z ostrzeżeniem o pamięci, ale moja aplikacja używa dość rozsądne ~125MB pamięci RAM w większości przypadków. Czy ktoś może zaoferować jakieś rady lub rzeczy do zbadania?

Author: halfer, 2013-08-16

4 answers

Opisane zachowanie zawsze istniało: jeśli pracujesz nad wątkami w tle, a następnie wywołujesz i używasz metod UIKit, to często aktualizacja będzie opóźniana w dziwny sposób.

Z tego powodu powinieneś zawsze dispatch_async przejść do kolejki głównej, aby zaktualizować interfejs użytkownika.

Te błędy są bardzo trudne do złapania, ponieważ nie zawsze występują w sposób przewidywalny.

Aby je złapać, zbudowałem metodę, która sprawdza niektóre metody UIKit, aby sprawdzić, czy są wywoływane w głównym wątku. To pozwala zatrzymać się na symbolicznym punkcie przerwania, gdy zapomnisz wysłać z powrotem do kolejki głównej.

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

 39
Author: Cocoanetics,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-26 16:32:38

Dobre obejście z forów deweloperów Apple na ten temat:

Zrób to:

[UIView setAnimationsEnabled:YES] 

I animacje zaczynają działać ponownie. Podejrzewam, że jest to albo zwykły błąd iOS7, albo gdzieś w moim kodzie animacja lub UIViewController uruchamia się w wątku w tle, powodując zatrzymanie animacji. Prawdopodobnie nie ma związku z bliżej nieokreśloną przyszłą wersją iOS.

 14
Author: Nick Locking,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-26 16:33:27

Ten problem wydaje się być spowodowany przez robienie rzeczy UIKit w wątkach w tle. Mam pre - render Cache pełen NSOperations, który renderuje złożone UIViews do UIImages buforować wyjście. Wydawało się, że działa to dobrze w iOS6, ale prawdopodobnie nieco przekracza linię. Będę musiał zastąpić tę funkcjonalność czymś, co renderuje obrazy i tekst do bufora graficznego, a nie za pomocą UIViews i UILabels w ogóle.

 0
Author: Nick Locking,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-20 18:46:32

Wszystko, co musisz zrobić, to złapać główną kolejkę podczas aktualizacji interfejsu po otrzymaniu odpowiedzi z API.Ios domyślnie używa kolejki głównej do aktualizacji interfejsu użytkownika, ale nie jest w 100% wydajny.Dlatego musisz upewnić się, że interfejs zostanie zaktualizowany tylko w głównym wątku, a sposób, aby to zrobić, jest jak poniżej: {]}

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

Jeśli nie łapiesz głównego wątku animacje mogą, ale nie muszą działać. Ale jeśli używasz głównego wątku animacje będą zdecydowanie działać.

Poprawny kod podczas aktualizacji UI na API odpowiedź:

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()
  }
})

Nieprawidłowy kod, który może powodować zatrzymanie animacji i prowadzić do dziwnych awarii:

  Alamofire.getApiCall(paramaters: parameters, completion:{
  response in 
  // UI related code.
    self.label.text = "abc" 
    self.button.setTitle("xyz",.normal)
    self.tableView.reloadData()
})
 0
Author: Pranav Gupta,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-05 09:52:05