0

画面に表示するには、データベースからデータを取得する必要があります。アプリケーションがブロックされないようにしたいので、データを取得してデータを追加する前に、次の画面を表示します。

これは、画面上に必要な情報を追加する方法です。

- (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が発生します。

4

1 に答える 1

2

バックグラウンド スレッドで Cocos2D を実行するには、新しい EAGLContext を作成する必要があります。このような:

- (void)createMySceneInBackground
{
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    EAGLContext *k_context = [[[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES1 sharegroup:[[[[CCDirector sharedDirector] openGLView] context] sharegroup]] autorelease];
    [EAGLContext setCurrentContext:k_context];

    if (infoMenu != nil) {
        infoMenu.position = ccp(winSize.width - kSSInfoPaddingX, winSize.height - kSSInfoPaddingY);
        [self addChild:infoMenu z:zIndex++]; // (1)
    }

    [pool release];
}

幸運を!

于 2012-08-03T15:46:16.400 に答える