0

这真的让我发疯。

我有一个按钮,如果触摸该按钮,它将调用一个更新 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 没有更新?非常感谢!

4

1 回答 1

4

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

于 2013-06-23T08:16:42.323 回答