使用 GCD 计算从后台队列加载数据的百分比
Calculating percentage of loaded data from background queue using GCD
我想在 SpriteKit 中制作简单的进度条。为了简化示例,我将使用 SKLabelNode 及其文本 属性,这将指示进度。
这是代码(GameScene.m):
#import "GameScene.h"
@interface GameScene ()
typedef void (^CompletitionHandler)(void);
@property (nonatomic,strong)SKLabelNode* progressBar;
@end
@implementation GameScene
-(void)didMoveToView:(SKView *)view {
/* Setup your scene here */
self.progressBar = [SKLabelNode labelNodeWithFontNamed:@"Chalkduster"];
self.progressBar.fontColor = [SKColor redColor];
self.progressBar.fontSize = 24.0;
self.progressBar.position = CGPointMake(CGRectGetMidX(self.frame),CGRectGetMidY(self.frame));
[self addChild:self.progressBar];
[self loadSceneAssetsWithCompletionHandler:^{
[self setupScene:view];
}];
}
- (void)loadSceneAssetsWithCompletionHandler:(CompletitionHandler)handler {
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
// Load the shared assets in the background.
//This part simulates bunch of assets(textures, emitters etc) loading in background
for (int i = 0; i <= 100; i++) {
[NSThread sleepForTimeInterval:0.01];
float progressValue = (float)i;
dispatch_async(dispatch_get_main_queue(), ^{
self.progressBar.text = [NSString stringWithFormat:@"%1.f", progressValue];
});
}
if (!handler) {
return;
}
dispatch_async(dispatch_get_main_queue(), ^{
// Call the completion handler back on the main queue.
handler();
});
});
}
现在我试图找到一种明显的方法,如果有的话,根据从后台队列加载的数据的 百分比 来更新进度。
问题是我想显示从 0 到 100 的加载数据的百分比。但我不知道如何判断一堆纹理、发射器和节点的 1%,或者我可以说,我不知道如何在加载 %1 后更新进度条。这是因为我正在处理不同类型的对象。有什么方法可以检查某些后台队列的状态,看看还有多少东西要执行(加载)?
有人有什么想法或建议吗?
如果您想获得更新,例如,纹理图集还剩多少要加载,那么答案是您不能。
但是您可以保留一个 "load items" 计数器并在资产加载后更新它。例如,您有 13 个纹理图集要加载和一些声音文件,这两个文件的加载方法都具有完成功能。
- (void)preloadWithCompletionHandler:(void (^)(void))completionHandler
playSoundFileNamed:(NSString *)soundFile
waitForCompletion:(BOOL)wait
每次资产完成加载时,更新您的计数器。老实说,我不确定这是否真的有必要,因为加载通常很快发生。显示几秒钟的通用 "loading" 消息可能是您最好(也是最简单)的选择。
我想在 SpriteKit 中制作简单的进度条。为了简化示例,我将使用 SKLabelNode 及其文本 属性,这将指示进度。
这是代码(GameScene.m):
#import "GameScene.h"
@interface GameScene ()
typedef void (^CompletitionHandler)(void);
@property (nonatomic,strong)SKLabelNode* progressBar;
@end
@implementation GameScene
-(void)didMoveToView:(SKView *)view {
/* Setup your scene here */
self.progressBar = [SKLabelNode labelNodeWithFontNamed:@"Chalkduster"];
self.progressBar.fontColor = [SKColor redColor];
self.progressBar.fontSize = 24.0;
self.progressBar.position = CGPointMake(CGRectGetMidX(self.frame),CGRectGetMidY(self.frame));
[self addChild:self.progressBar];
[self loadSceneAssetsWithCompletionHandler:^{
[self setupScene:view];
}];
}
- (void)loadSceneAssetsWithCompletionHandler:(CompletitionHandler)handler {
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
// Load the shared assets in the background.
//This part simulates bunch of assets(textures, emitters etc) loading in background
for (int i = 0; i <= 100; i++) {
[NSThread sleepForTimeInterval:0.01];
float progressValue = (float)i;
dispatch_async(dispatch_get_main_queue(), ^{
self.progressBar.text = [NSString stringWithFormat:@"%1.f", progressValue];
});
}
if (!handler) {
return;
}
dispatch_async(dispatch_get_main_queue(), ^{
// Call the completion handler back on the main queue.
handler();
});
});
}
现在我试图找到一种明显的方法,如果有的话,根据从后台队列加载的数据的 百分比 来更新进度。
问题是我想显示从 0 到 100 的加载数据的百分比。但我不知道如何判断一堆纹理、发射器和节点的 1%,或者我可以说,我不知道如何在加载 %1 后更新进度条。这是因为我正在处理不同类型的对象。有什么方法可以检查某些后台队列的状态,看看还有多少东西要执行(加载)?
有人有什么想法或建议吗?
如果您想获得更新,例如,纹理图集还剩多少要加载,那么答案是您不能。
但是您可以保留一个 "load items" 计数器并在资产加载后更新它。例如,您有 13 个纹理图集要加载和一些声音文件,这两个文件的加载方法都具有完成功能。
- (void)preloadWithCompletionHandler:(void (^)(void))completionHandler
playSoundFileNamed:(NSString *)soundFile
waitForCompletion:(BOOL)wait
每次资产完成加载时,更新您的计数器。老实说,我不确定这是否真的有必要,因为加载通常很快发生。显示几秒钟的通用 "loading" 消息可能是您最好(也是最简单)的选择。