2014-02-18 2 views
0

фона:Задержка при обновлении UILabel в UITableViewCell

У меня есть пользовательский UITableViewCell подкласс (AlbumCell), который, в свою очередь, имеет два подкласса (Type1AlbumCell and Type2AlbumCell). AlbumCell действует только как абстрактный класс, а последние два выложены как прототипные ячейки в UITableViewController в раскадровке. AlbumCell объявляет два IBOutlets, likeCountLabel и shortTitleLabel, которые каждый подкласс соединяет два через свой макет в качестве ячейки прототипа в раскадровке.

Проблема:

Существует задержка при обновлении текста для каждой этикетки в Type2AlbumCell, в то время как Type1AlbumCell обновления сразу же после установки значений. Это не результат основного потока, который удерживается, поскольку вы можете прокручивать и выполнять другие действия, пока вы ожидаете обновления текста. Это займет всего 4-5 секунд. Кто-нибудь испытал что-то подобное раньше? Благодарю.

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

+0

Это трудно сказать что-либо о без кода, чтобы сопровождать его. – mattsven

+0

почтовый код, вы уже пробовали. – Pawan

+1

«Задержка» 4-5 секунд примерно _always_ означает, что вы используете этот код в фоновом потоке. Не. – matt

ответ

-1

Проблема заключалась в том, что я звонил в UIKit из блока завершения, который работал на фоновом потоке. Вначале я решил это как причину проблемы, потому что сразу же вызывался другой кусок кода в блоке завершения. Я не понял, что вызов UIKit из фонового потока может привести к неустойчивому поведению, потому что UIKit не является потокобезопасным.

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

- (void)runBlockOnMainQueueWithoutDeadlocking:(void (^)(void))block { 
if ([NSThread isMainThread]) { 
    block(); 
} else { 
    dispatch_sync(dispatch_get_main_queue(), block); 
}} 

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

Вы также можете использовать performSelectorOnMainThread:

+0

Я не понимаю, что, по вашему мнению, получено в результате теста 'isMainThread'. Я также не понимаю, что, по вашему мнению, получает 'dispatch_sync'. Способ гарантировать выполнение на главной теме безвредно: 'dispatch_async (dispatch_get_main_queue() ...'. Существует никакой опасности тупика. Почему вы делаете что-то трудное для себя? – matt

Смежные вопросы