3

目前我想获取 facebook 个人资料图片,然后将图片转换为 CCSprite。

到目前为止,我的代码如下所示:

//fbId is facebook id of someone
NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"https://graph.facebook.com/%@/picture?type=normal", fbId]];
NSData *data = [NSData dataWithContentsOfURL:url];
UIImage *image = [UIImage imageWithData:data];

//convert UIImage to CCSprite
CCTexture2D *texture = [[[CCTexture2D alloc] initWithImage:image resolutionType:kCCResolutionUnknown] retain];
CCSprite *sprite = [CCSprite spriteWithTexture:texture];
[self addChild:sprite];

它可以工作,但是在加载之前需要一段时间,大约几秒钟。

我的问题是,除了互联网连接,有没有更好的方法来尽快加载 Facebook 个人资料图片?谢谢

4

2 回答 2

7

您将网络代码放在主线程中,这会阻塞 UI 并带来糟糕的用户体验。通常,您应该将此类内容放在另一个线程中。尝试使用调度

dispatch_queue_t downloader = dispatch_queue_create("PicDownloader", NULL);
dispatch_async(downloader, ^{
    NSData *data = [NSData dataWithContentsOfURL:url];
    UIImage *image = [UIImage imageWithData:data];
    dispatch_async(dispatch_get_main_queue(), ^{
        CCTexture2D *texture = [[[CCTexture2D alloc] initWithImage:image resolutionType:kCCResolutionUnknown] retain];
        CCSprite *sprite = [CCSprite spriteWithTexture:texture];
        [self addChild:sprite];
    });
});

或者,如果您愿意,可以尝试JBAsyncImageView。也许你必须把它破解到你的 CCSprite :)

于 2012-12-05T04:35:28.853 回答
1

一方面,我会选择使用AFNetworking来异步请求图像数据。我的猜测是这就是造成延迟的原因。您可能会注意到您的 UI 在这几秒钟内被锁定。异步调用该数据将解决此问题。更好的是,您可以考虑使用Facebook 的 iOS SDK来调用图像。

于 2012-12-05T04:25:28.870 回答