iOS:performSelector On Background / Main Thread:不更新标签

时间:2012-12-06 17:47:38

标签: objective-c ios

我在后台运行了一个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";
}

3 个答案:

答案 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);
}