我正在尝试从代码块中设置 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]];
});
}];
它现在确实有效了,但我不知道为什么。如果我尝试更改标签的图层背景颜色,也会发生同样的情况,没有任何反应,但过了一会儿我可以看到它闪烁和变化。
谁能指出这是怎么回事,我该如何避免这种情况?
最佳答案
正如@MidhunMP 所指出的,UI 应该始终从主线程更新。它在您的第二个示例中起作用的原因是因为您使用 dispatch_get_main_queue()
在主线程上分派(dispatch) UI 更新。
从非主线程更新可能会产生非常不可预测的结果,从崩溃到未更新的 UI,再到破坏你的 UI。
关于ios - 从 block 中设置 UILabel 的文本不能按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23658783/