Простой и быстрый способ доступа к UIView из разных потоков - PullRequest
1 голос
/ 06 сентября 2011

У меня есть такой интерфейс:

@interface AView : UIScrollView
{
    UIView* m_view1;
    UIView* m_view2;
    ...
}

-(void) method1;
-(void) method2;
...
@end

Мне нужно получить доступ к представлениям из методов интерфейса.Мне нужно создать, выпустить, заново создать их, а также установить свойства.

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

Как мне синхронизировать доступ к просмотрам?

Ответы [ 3 ]

5 голосов
/ 06 сентября 2011

Прежде всего, знаете ли вы, что вы можете вызывать ТОЛЬКО методы класса UIView (и его подклассов) в главном потоке?Но, если вы просто выполняете create и release во втором потоке, это нормально.

Потоки

Манипуляции с пользовательским интерфейсом вашего приложения должны происходить в главном потоке.Таким образом, вы всегда должны вызывать методы класса UIView из кода, выполняющегося в основном потоке вашего приложения.Единственный момент, когда это может не быть строго необходимым, - это создание самого объекта представления;но все остальные манипуляции должны выполняться в главном потоке.

Кроме того, вы можете использовать @synchronized() {object} для блокировки объекта.Но, тем не менее, вы НЕ можете вызывать методы UIView во втором потоке (в Objective-C даже свойство set вызывает метод), даже если вы заблокировали его.

Objective-C поддерживает многопоточность в приложениях.Таким образом, два потока могут пытаться изменить один и тот же объект одновременно, что может вызвать серьезные проблемы в программе.Чтобы защитить разделы кода от одновременного выполнения более чем одним потоком, Objective-C предоставляет директиву @synchronized ().

Директива @synchronized () блокирует раздел кода для использования однимнить.Другие потоки блокируются до тех пор, пока поток не выйдет из защищенного кода, то есть когда выполнение продолжается после последнего оператора в блоке @synchronized ().

Директива @synchronized () принимает в качестве единственного аргумента любой Objective-Объект C, включая себя.

2 голосов
/ 06 сентября 2011

Например, вы можете использовать NSLock , но вы не должны обновлять свой интерфейс из других потоков.Единственный поток, из которого вы должны обновить пользовательский интерфейс - это основной поток.

1 голос
/ 06 сентября 2011

UIKit можно безопасно использовать только в главном потоке!Вы используете NSOperation?Вы увидите использование performSelectorOnMainThread:withObject:waitUntilDone: для перемещения операций, выполненных из других потоков, в основной поток.

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