我需要从数据库中检索一些数据以显示在屏幕上。我想避免应用程序阻塞,因此在检索任何数据并添加数据之前显示下一个屏幕。
这是在屏幕上添加我需要的信息的方法:
- (void)initInfo
{
CGSize winSize = [[CCDirector sharedDirector] winSize];
CCMenu *infoMenu;
// get the info in seperate thread since it may block
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
infoMenu = [PlayerInfoHelper generateInfoForPlayerWithId:[PlayerManager sharedInstance].activePlayer.objectId tag:-1 sender:self];
dispatch_async(dispatch_get_main_queue(), ^{
if (infoMenu != nil) {
infoMenu.position = ccp(winSize.width - kSSInfoPaddingX, winSize.height - kSSInfoPaddingY);
[self addChild:infoMenu z:zIndex++]; // (1)
}
});
});
}
generateInfoForPlayerWithId:tag:sender: 方法可能会阻塞,这就是我将它放在自己的线程中的原因。我在主线程中添加菜单,因为它是 UI 更新。
我确信 infoMenu 是正确的 CCMenu* 对象。
当我没有注释掉 // (1) 指示的行时,我得到一个 EXC_BAD_ACCESS。