NSThread 创建线程和更新UI

来源:互联网 发布:找不到usb打印机端口 编辑:程序博客网 时间:2024/05/16 18:05

NSThread创建线程:

第一种:[NSThread detachNewThreadSelector:@selector(myThreadMainMethod:) toTarget:self withObject:nil];


第二种:NSThread* myThread = [[NSThread alloc] initWithTarget:self  selector:@selector(myThreadMainMethod:)object:nil];
           [myThread start];                             

第一种是创建之后马上跑到myThreadMainMethod去做事情去了,而第二种还需要手动调用 start 函数,所以在启动线程之前,对线程进行配置,比如设置 stack 大小,线程优先级等;


更新UI:

-(void)changeText:(NSString *)str
{
    [changeLable setText:str];
}
-(void)myThreadMainMethod
{
    int i=0;
    NSString * str=nil;
    for(;i<20;i++)
    {
        printf("subThread is running i=%d\n",i);
        str=[[NSString alloc]initWithFormat:@"%d",i];
        NSLog(@"%@",str);
        [self performSelectorOnMainThread:@selector(changeText:) withObject:str waitUntilDone:YES];
        [NSThread sleepForTimeInterval:1.0];
    }
}

- (void)viewDidLoad
{
    changeLable= [[UILabel alloc]initWithFrame:CGRectMake(20, 230, 210, 41)];
    [self.view addSubview:changeLable];
    NSThread * myThread = [[NSThread alloc]initWithTarget:self selector:@selector(myThreadMainMethod) object:nil];
    [myThread start];
    [super viewDidLoad];
}

iphone开发中,在主线程之外的线程更新主线程所显示的界面元素,不能直接调用主线程的类的更新界面的方法,否则界面看不到任何结果
.而是需要有个缓冲,叫做
performSelectorOnMainThread
使用方法是,在线程调用到更新界面那个类的时候,在更新界面前,通过如下调用.
[self performSelectorOnMainThread:@selector(updateLabel:) withObject:updateData waitUntilDone:YES];
比如说你已经定义了一个- (void)updateLabel:(NSString *)txt{}的方法.在此方法中更新界面即可.即时看到结果.


原创粉丝点击