从块中设置UILabel的文本不能按预期工作

时间:2014-05-14 15:18:46

标签: ios objective-c ios7 objective-c-blocks weak-references

我试图在代码块中设置UILabel的文字:

PLSRootViewController * __weak weakSelf = self;

[self.analytics.client setMessageHandler:^(MQTTMessage *message) {

    NSArray *beacons = [NSJSONSerialization JSONObjectWithData:message.payload options:NSJSONReadingAllowFragments error:nil];

    weakSelf.streamingCountLabel.text = [NSString stringWithFormat:@"%i", [beacons count]];
}];

但它的行为并不像我期望的那样,即使文本没有改变,如果我登录NSLog它实际上记录了我期望的内容。

我无法找到原因,但我尝试了以下内容:

PLSRootViewController * __weak weakSelf = self;
dispatch_time_t delay = dispatch_time(DISPATCH_TIME_NOW, (int64_t) (NSEC_PER_SEC * 0.0));

[self.analytics.client setMessageHandler:^(MQTTMessage *message) {

    NSArray *beacons = [NSJSONSerialization JSONObjectWithData:message.payload options:NSJSONReadingAllowFragments error:nil];

    NSLog(@"Message: %@", beacons);

    //weakSelf.streamingCountLabel.text = [NSString stringWithFormat:@"%i", ];


    dispatch_after(delay, dispatch_get_main_queue(), ^(void){
        // do work in the UI thread here

        weakSelf.streamingCountLabel.text = [NSString stringWithFormat:@"%i", [beacons count]];

    });
}];

它现在确实有效,但我不知道为什么。如果我尝试更改标签的图层背景颜色,没有任何反应,也会发生同样的情况,但过了一会儿,我可以看到它闪烁和变化。

有人能指出发生了什么,我怎么能避免这种情况?

2 个答案:

答案 0 :(得分:2)

正如@MidhunMP所指出的,应始终从主线程更新UI。它在第二个示例中起作用的原因是因为您使用dispatch_get_main_queue()在主线程上调度UI更新。

从非主线程更新可能会产生非常不可预测的结果,从崩溃到未更新的UI,再到破坏用户界面。

答案 1 :(得分:0)

如果streamingCountLabel == nil,或者如果你在非主线程中调用block,则此代码不起作用。你能检查一下吗?