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{}的方法.在此方法中更新界面即可.即时看到结果.