2015-11-06 42 views
1

我正在构建一个SpriteKit游戏,利用Facebook图表检索朋友(他们也使用该应用程序)的图像以显示在关卡选择屏幕上。水平选择屏幕之前加载速度相当快,但我注意到需要加载的朋友图片越多,显示“水平选择”屏幕所需的时间就越长。 (屏幕将不会显示,直到所有的图像加载。)SpriteKit - 可以使用SDWebImage将Facebook朋友的图像延迟加载到spriteNodeWithTexture中?

所以我正在探索如何将我的朋友的个人资料图片加载到SKSpriteNodes以减少等级选择屏幕加载时的等待时间,图像在下载后自动显示。我目前正在尝试利用SDWebImage,但还没有看到有关如何将SDWebImage与SpriteKit结合使用的示例。

这是我到目前为止所做的。 SKSpriteNode将加​​载占位符图像没有问题,但它似乎像Sprite节点不关心在占位符图像应用后刷新它的图像。

UIImageView *friendImage = [[UIImageView alloc] init]; 
NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"https://graph.facebook.com/%@/picture?redirect=true", {FRIEND ID GOES HERE}]]; 
[friendImage sd_setImageWithURL:url placeholderImage:[UIImage imageNamed:@"user_placeholder_image"]]; 

SKSpriteNode* playerPhoto = [SKSpriteNode spriteNodeWithTexture:[SKTexture textureWithImage:friendImage.image]]; 
[self addChild: playerPhoto]; 

如果任何人有任何关于如何使用SpriteKit完成延迟加载的见解,将不胜感激。

谢谢!

回答

2

在寻找其他方式将图像“延迟加载”到SKSpriteNode后,我发现了Grand Central Dispatch(GCD)是什么以及它如何为我正在尝试做的工作。我其实不需要使用SDWebImage。

这里是我用来获取完美的结果代码:

// init the player photo sprite node - make sure to use "__block" so you can use the playerPhoto object inside the block that follows 
__block SKSpriteNode* playerPhoto = [[SKSpriteNode alloc] init]; 

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0ul); 
dispatch_async(queue, ^{ 
    NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:[NSString stringWithFormat:@"https://graph.facebook.com/%@/picture?redirect=true", {FRIEND FB ID GOES HERE}]]]; 
    UIImage *image = [UIImage imageWithData:data]; 
    dispatch_async(dispatch_get_main_queue(), ^{ 

     // update player photo texture after image was downloaded 
     playerPhoto.texture = [SKTexture textureWithImage:image]; 
     NSLog(@"fb image downloaded and applied!"); 
    }); 
}); 

// use a placeholder image while fb image downloads 
playerPhoto = [SKSpriteNode spriteNodeWithTexture:[SKTexture textureWithImage:[UIImage imageNamed:@"user_placeholder_image"]]]; 

希望这可以帮助别人的未来。 :)