为什么我的GCD方法没有响应?

时间:2012-06-24 05:07:57

标签: objective-c multithreading grand-central-dispatch

有人知道为什么bmlabel没有更新吗?日志“得分”什么都没有显示?没有GCD,它工作正常,但它阻止ui(我想显示100到500之间的数字,例如显示101,102 ... 499,500非常快,而不是直接从“100”到“ 500" )。所以我想用另一个线程来计算它,即使我不确定它是最好的方法。这是我的代码:

//in .h, i imported :
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>


//in .m
@implementation ScoreLayer

-(void)updateScore:(int)num{
    CCLOG(@"hello");
    int newScore = score+num;
    //dispatch_queue_t queue = dispatch_queue_create("Test", 0);
    dispatch_queue_t main = dispatch_get_main_queue();
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0ul);

    dispatch_async(queue, ^{
        for (int i=score; i< newScore; i++){
            score++;
            CCLOG(@"score:%i", score);
            NSString *str = [NSString stringWithFormat:@"%d", score];

            dispatch_async(main, ^{
                [bmlabel setString:str];
            });

        }
    });
    score = newScore;
}

-(id) init
{
    if( (self=[super init])) {
        bmlabel = [CCLabelBMFont labelWithString:@"14763" fntFile:@"TestFont.fnt"];
        bmlabel.anchorPoint = ccp(0, 0.5f);
        bmlabel.position = ccp(0,250.0f);
        [self addChild:bmlabel z:200]; 
            score = 14763;
    }
    return self;
}

非常感谢

2 个答案:

答案 0 :(得分:2)

您的块正在异步执行,这意味着该块在新的运行循环中执行(=将score设置为newScore后)。

答案 1 :(得分:2)

我认为score属性是__block类型,因为你在块内更改它:

 score++;

因为你的块是以dispatch_async执行的,所以主循环继续执行,并且很可能在你的块开始之前遇到score = newScore;。当您的块即将运行时,score已经等于newScore并且您的循环将永远不会起作用,因为它的条件表达式将返回false。在:

for (int i=score; i< newScore; i++)

i将等于newScore,因为newScore < newScore为false,您的循环将永远无法运行。

我建议您删除updateScore:方法中的最后一行。

score = newScore;