UI未在主线程中更新

时间:2013-06-22 20:14:10

标签: 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!

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

1 个答案:

答案 0 :(得分:4)

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