ios - UI 未在主线程中更新

标签 ios objective-c multithreading

这真让我抓狂。

我有一个按钮,如果触摸该按钮,它将调用更新 UI 的方法。这是有问题的方法:

- (void)loadLevelWithImagePath:(NSString *)imagePath difficulty:(int)difficulty modelName:(NSString *)modelName
{
    // do stuffs
}

除了它没有。

然而,当我将整个方法主体包含在:

dispatch_async(dispatch_get_main_queue(), ^{
    // do stuffs
}

有效!

但是,我感到困惑,因为当我在方法中放置断点时,根据调试器,它已经在主线程中了。另外,如果我进行这两项检查:

- (void)loadLevelWithImagePath:(NSString *)imagePath difficulty:(int)difficulty modelName:(NSString *)modelName
{
    NSLog(@"%d", [NSThread currentThread] == [NSThread mainThread]);
    dispatch_async(dispatch_get_main_queue(), ^{
        NSLog(@"%d", [NSThread currentThread] == [NSThread mainThread]);
        // do stuffs
    }
}

两者都返回 TRUE!

所以我的问题是,为什么 UI 没有更新?非常感谢!

最佳答案

这可能是一个nil 问题,但是,您提供的信息太少,无法确定。它与 dispatch_async 一起工作的原因并不一定是你从中调用方法的线程,可能是在你调用代码时,你的一些 UI 对象是零。当您调用 dispatch_async 时,您将作业添加到队列中,但由于所有调度队列都是先进先出的数据结构,您实际上是在运行循环的末尾添加作业,这可能会给出初始化时间(无论在哪里完成)

关于ios - UI 未在主线程中更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17254889/

相关文章:

ios - 为什么我的函数输出一个看起来像内存地址的随机值?

ios - 如何在 Scene Kit 中更改场景?

ios - 如何在 Swift 中将 [Int] 转换为 Int...?

Kurento 教程的 iOS 客户端

ios - 在 iOS 中实时访问视频帧

objective-c - var Array 类型的 Swift 类字段被转换为不可变的 NSArray 而不是 NSMutableArray

objective-c - 将filteredArrayUsingPredicate应用于多维NSMutableArray的特定列

java - 线程安全的 java servlet

java - 杀死正在等待套接字输出的线程

java - 如何有效地将 HttpComponentsClientHttpRequestFactory 与 RestTemplate 结合使用?