Сбой в фоновом потоке в UIScrollview - PullRequest
0 голосов
/ 04 марта 2011

Чтобы улучшить производительность, я создаю подпредставления для моего вида прокрутки в фоновом потоке, а затем публикую событие в основном потоке, используя performSelectorOnMainThread, добавляю представление в вид прокрутки и переводю его в шрифт. Однако иногда я получаю сбой.

Когда я проверяю это в моей фоновой ветке.

if( nil == myView.view.superview)

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

ТИА

Правин S

EDIT:

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

[self performSelectorInBackground:@selector(loadPages:) withObject:nil];

На страницах загрузки я делаю следующее

if( nil == myView.view.superview) 
{
Create the view
 [[self performSelectorOnMainThread:@selector(refreshViews:) myView.view waitUntilDone:YES];
}

В режиме обновления я добавляю подпредставление в представление прокрутки и выводю его на передний план.

[myScrollView addSubview:views];
[myScrollView bringSubviewToFront:views];

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

Отладчик сообщает, что сбой произошел по адресу obj_msgSend после проверки if на страницах загрузки.

РЕДАКТИРОВАТЬ: трассировка стека - Ну, это произошло при проверке @synchronized на этот раз. Я отредактировал журнал сбоев, чтобы удалить конкретные имена проектов по соображениям безопасности, но трассировка такая, как показано ниже.

#0  0x33a06464 in objc_msgSend ()
#1  0x314d6984 in -[UIViewController _loadViewFromNibNamed:bundle:] ()
#2  0x314d5cb8 in -[UIViewController loadView] ()
#3  0x313d6226 in -[UIViewController view] ()
#6  0x00009920 in -[myViewController loadPages:] (self=0x12a2a0, _cmd=0x1eac1, abcd=0x0) at 
#7  0x302d9198 in -[NSThread main] ()
#8  0x302d2248 in __NSThread__main__ ()
#9  0x3110c88c in _pthread_start ()
#10 0x31101a90 in thread_start ()

1 Ответ

1 голос
/ 04 марта 2011

UIKit не является потокобезопасным, если не указано иное. Создание представлений (и загрузка перьев) в фоновом режиме не поддерживается; все, что касается UIView, должно происходить в главном потоке. Это применяется даже до того, как ваш вид был добавлен в суперпредставление.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...