gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 13:17:49 26 4
gpt4 key购买 nike

有谁知道为什么 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;
}

非常感谢

最佳答案

我假设 score属性是 __block键入,因为您要在 block 内更改它:

 score++;

因为你的 block 是用 dispatch_async 执行的主循环继续执行,最有可能遇到 score = newScore;在你的街区开始之前。当你的 block 即将运行时, score已经相等 newScore并且您的循环将永远无法工作,因为它的条件表达式将返回 false。在:
for (int i=score; i< newScore; i++)
i将等于 newScore因为 newScore < newScore是假的,你的循环将永远不会运行。

我建议删除 updateScore: 中的最后一行方法。
score = newScore;

关于objective-c - 为什么我的 GCD 方法没有响应?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11175107/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com