ios - 从 block 中设置 UILabel 的文本不能按预期工作

标签 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]];

    });
}];

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

谁能指出这是怎么回事,我该如何避免这种情况?

最佳答案

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

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

关于ios - 从 block 中设置 UILabel 的文本不能按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23658783/

相关文章:

objective-c - 替换现有 NSView 的 NSResponder

ios - 我如何将 swrevealview 作为第三个 View Controller ,如果我们将 swrevealview 作为初始 View Controller 其工作

objective-c - UIBarButtonItem 中的 UIButton 放弃了动画效果

ios - 在 iOS 的 UI 自动化中,如何在执行 #import 之前等待 performTaskWithPathArgumentsTimeout 完成

ios - 为什么 NSString 不响应选择器 longValue 但响应 longLongValue 和 intValue?

ios - 是否可以列出当前应用程序中的所有 RemoteIO 音频单元?

ios - 未找到 map 盒。 @mapbox/react-native-mapbox-gl 不在 CircleCi 上构建 iOS 项目

objective-c - 如何降低 iPhone objective-c 中的图像质量/尺寸?

xcode - 如何提高 iOS 7 中工具栏和导航栏上按钮的点击能力

ios - 如何从 iOS 应用程序打开 Twitter 登录页面