我想从单独的线程更新iPhone表单上的标签。线程正在运行但标签未更新。
这是我的代码
-(void)launchThread:(id)param;
@property (weak, nonatomic) IBOutlet UILabel *timeLabel;
...
-(void) launchThread:(id)param{
UILabel *control = (UILabel*)param;
NSMutableString *str;
for (int i=0; i<1000; i++) {
str = [NSMutableString stringWithFormat:@"%d",i];
control.text=str;
NSLog(@"%@",str);
sleep(1);
}}
...
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
[NSThread detachNewThreadSelector:@selector(launchThread:) toTarget:self withObject:timeLabel];
}
我猜标签的文本已更新但未在表单上刷新。我该如何刷新它?
我试图寻找类似的帖子,但它们对我不起作用。对不起,如果我重复这个问题。
答案 0 :(得分:2)
@jackslash是正确的,你只能更新主线程(UI线程)上的接口。我建议使用performSelectorOnMainThread
来更新你的UILabel。我认为语法类似于:
[self.label performSelectorOnMainThread : @ selector(setText : ) withObject:str waitUntilDone:YES];
不太确定。做一些谷歌搜索,你应该能够找到一个有效的例子。
答案 1 :(得分:1)
在iOS中,您只能使用主线程来更新界面。
您可以通过两件事轻松地从线程更新界面。像这样使用NSObject的方法:
[self performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait];
使用块和GCD:
dispatch_async(dispatch_get_main_queue(),{
//code to execute on main thread
});