1

bmlabelが更新されない理由を知っている人はいますか? ログの「スコア」には何も表示されませんか?GCD がなくても問題なく動作しますが、UI がブロックされます (たとえば、「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;
}

どうもありがとう

4

2 に答える 2

2

行内のブロック内でプロパティを変更しているため、scoreプロパティはタイプであると想定しています。__block

 score++;

ブロックがメインループで実行され、実行が継続され、ブロックが開始される前にdispatch_async遭遇する可能性が最も高いためです。score = newScore;ブロックが実行されようとしているとき、scoreはすでに等しくnewScore、条件式が false を返すため、ループは機能しません。の:

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

iはfalse であり、false でnewScoreあるためnewScore < newScore、ループは実行されません。

メソッドの最後の行を削除することをお勧めしますupdateScore:

score = newScore;
于 2012-06-24T16:56:54.110 に答える
2

ブロックは非同期で実行されています。これは、ブロックが新しい実行ループで実行されることを意味します ( = に設定scoreした後newScore)。

于 2012-06-24T16:40:47.243 に答える