画面に表示するには、データベースからデータを取得する必要があります。アプリケーションがブロックされないようにしたいので、データを取得してデータを追加する前に、次の画面を表示します。
これは、画面上に必要な情報を追加する方法です。
- (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が発生します。