这真让我疯了。
我有一个按钮,如果触摸该按钮,它将调用更新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!
所以我的问题是,为什么用户界面没有更新?非常感谢!
答案 0 :(得分:4)
这可能是nil
问题,但是,您提供的信息太少,无法确定。它与dispatch_async
一起使用并且不是没有的原因不一定是你调用方法的线程,可能是在你调用代码时,你的一些UI对象是零。当您调用dispatch_async
时,您将作业添加到队列中,但由于所有调度队列都是先进先出数据结构,因此您实际上在运行循环结束时添加了作业,这可能会为初始化提供时间(无论在哪里)