2013-08-16 3 views
20

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

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

+0

Дополнительная информация будет полезна здесь. Что вы анимируете и как? Можете ли вы опубликовать соответствующий код?В противном случае вам может быть повезло на форумах Apple Dev. –

+0

Я делаю абсолютно нормально [self.navigationController pushViewController: viewController animated: YES] - переходы контроллера стиля. К сожалению, форумы apple dev - это немного пустошь по сравнению с SO в моем опыте, но у меня там тоже есть нить. –

+0

Вы вообще не используете пользовательские подклассы UIViewControllers? Просто запасные части? Я никогда не слышал об остановке анимации из-за давления памяти; что кажется маловероятным. – Jeff

ответ

39

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

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

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

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

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

+0

Этот код точно так же, как я нашел фоновый материал. –

+0

Из источника iHunter вам необходимо DTObjectBlockExecutor, NSObject + DTRuntime и UIView + DTDebug, чтобы подмешать метод просмотра и уловить проблемы. –

+0

Wow !! большое спасибо!! здорово!!! Кокоэнетика, которую вы качаете! – user1010819

14

Хорошего обходной путь от Девых форумов Apple, по этому вопросу:

ли это:

[UIView setAnimationsEnabled:YES] 

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

+0

Fyi, в нашей анимации просмотра приложения, похоже, работает нормально, fyi. Также добавлен вопрос. Думал, что это хороший вопрос. – ort11

+1

почему вы отправляете в качестве ответа? это тоже ДВЕ ответы? пожалуйста, поставьте это на вопрос после его редактирования ... –

0

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

0

Все, что вам нужно сделать, это зацепится основной очередь при обновлении пользовательского интерфейса на получение ответа от API.Ios использует основную очередь по умолчанию для обновления пользовательского интерфейса, но это не 100 процентов efficient.Hence у вас есть чтобы убедиться, что пользовательский интерфейс обновляется на главном потоке только и способ сделать это, как показано ниже:

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() 
}) 
Смежные вопросы