我在后台运行了一个while语句。
- (IBAction)startButton
{
[self performSelectorInBackground:@selector(Counter) withObject:nil];
.....
}
- (void) Counter
{
while (round) {
if (condition)
{
NSString *str;
str = [NSString stringWithFormat:@"%d",counter];
[self performSelectorOnMainThread:@selector(updateLabel:) withObject:str waitUntilDone:NO];
}
}
}
- (void)updateLabel: (NSString*) str
{
[self.label setText:str];
NSLog(@"I am being updated %@",str);
}
NSlog获取了正确的更新值,但标签永远不会更新。
我做错了什么?
更新:
标签已连接,在while语句完成后,它会被启动。
我也初步确定了标签。
- (void)viewDidLoad
{ [super viewDidLoad];
label.text = @"0";
}
答案 0 :(得分:2)
检查IBOutlet是否在Interface Builder中连接
编辑3
尝试使用GCD
使用dispatch_async
调度请求,因此它变为
while (round) {
if (condition)
{
NSString * str = [NSString stringWithFormat:@"%d",counter];
dispatch_async(dispatch_get_main_queue(),^ {
[self updateLabel:str];
});
}
}
更新UILabel
的另一种方法是设置NSTimer
,每隔x
秒(根据您的需要)更新它,而不是使用while
进行循环。
这就像是
NSTimer * updateLabelTimer = [NSTimer scheduledTimerWithTimeInterval:0.5 target:self selector:@selector(updateLabel) userInfo:nil repeats:YES];
-(void)updateLabel {
if(condition) {
self.label.text = [NSString stringWithFormat:@"%d", counter];
}
}
答案 1 :(得分:1)
您的主线程可能正在等待您的后台线程完成。你是如何在后台线程上启动任务的?
答案 2 :(得分:0)
尝试
dispatch_after(DISPATCH_TIME_NOW, dispatch_get_main_queue(), ^(void){
[self updateLabel:str];
});
我更喜欢performSelectorOnMainThread:withObject:waitUntilDone:
。
如果无效,请检查label
是否为零。如果是,则过去更多代码。
FISRT评论后编辑:
NSTimer
可以提供帮助,但这也应该有效。
- (IBAction)startButton
{
[self Counter];
}
- (void) Counter
{
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
while (round) {
if (condition)
{
NSString *str;
str = [NSString stringWithFormat:@"%d",counter];
dispatch_async(dispatch_get_main_queue(), ^{
[self updateLabel:str];
});
}
}
});
}
- (void)updateLabel: (NSString*) str
{
[self.label setText:str];
NSLog(@"I am being updated %@",str);
}