我试图在代码块中设置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]];
});
}];
它现在确实有效,但我不知道为什么。如果我尝试更改标签的图层背景颜色,没有任何反应,也会发生同样的情况,但过了一会儿,我可以看到它闪烁和变化。
有人能指出发生了什么,我怎么能避免这种情况?
答案 0 :(得分:2)
正如@MidhunMP所指出的,应始终从主线程更新UI。它在第二个示例中起作用的原因是因为您使用dispatch_get_main_queue()
在主线程上调度UI更新。
从非主线程更新可能会产生非常不可预测的结果,从崩溃到未更新的UI,再到破坏用户界面。
答案 1 :(得分:0)
如果streamingCountLabel == nil,或者如果你在非主线程中调用block,则此代码不起作用。你能检查一下吗?