从不同的线程访问UIView的简单快捷的方法

时间:2011-09-06 07:49:19

标签: iphone ios multithreading ipad

我有这样的界面:

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

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

我需要从界面的方法访问视图。我需要创建,发布,重新创建它们以及设置属性。

问题是,接口的某些方法在不同的线程中运行。由于这些方法访问相同的视图,我遇到的问题就像一个线程在另一个线程试图设置正在重新创建的视图的某些属性时尝试重新创建视图。

我应该如何同步对视图的访问?

3 个答案:

答案 0 :(得分:5)

首先,你知道你只能在主线程中调用UIView类(及其子类)的方法吗?但是,如果您只是在第二个帖子中执行创建发布作业,则可以这样做。

  

线程注意事项

     

对应用程序的用户界面进行操作必须   主线程。因此,您应该始终调用UIView的方法   来自应用程序主线程中运行的代码的类。该   只有在创建视图时,这可能不是绝对必要的时间   对象本身;但所有其他操作都应该在主要操作上进行   线程。

此外,您可以使用@synchronized() {object}锁定对象。但是,你仍然不能在第二个线程中调用UIView的方法(在Objective-C中甚至set属性是调用方法),即使你已经锁定了它。

  

Objective-C支持应用程序中的多线程。因此,两个   线程可以尝试同时修改同一个对象,a   可能导致程序出现严重问题的情况。保护   代码段由一个以上的多个线程执行   time,Objective-C提供@synchronized()指令。

     

@synchronized()指令锁定一段代码供a使用   单线程。其他线程被阻塞,直到线程退出   受保护的代码 - 即执行继续执行最后一次   @synchronized()块中的语句。

     

@synchronized()指令作为唯一参数any   Objective-C对象,包括self。

答案 1 :(得分:2)

例如,您可以使用 NSLock ,但不应从其他线程更新UI。您应该更新UI的唯一线程是主线程。

答案 2 :(得分:1)

UIKit只能在主线程上安全使用!你使用NSOperation吗? 您将看到使用performSelectorOnMainThread:withObject:waitUntilDone:将从其他线程完成的操作移动到主线程。