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 回答