我正在加载Facebook图片。我试图使用下面的代码返回一个图像,以便我可以使用Core Data将其保存到'Friend'对象的记录中。它无法正常工作......没有任何回报。有没有办法在后台加载数据,然后在主队列上创建图像,然后返回?我需要在主队列上创建我的图像,因为我想用我的app delegate的托管对象上下文将它保存到我的对象。
+ (UIImage *)imageForObject:(NSString *)objectID {
NSString *url = [[NSString alloc] initWithFormat:@"https://graph.facebook.com/%@/picture?width=%d&height=%d",objectID,IMAGE_MAXWIDTH,IMAGE_MAXHEIGHT];
__block UIImage *image;
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:url]];
dispatch_async(dispatch_get_main_queue(), ^{
image = [[UIImage alloc] initWithData:data];
});
});
return image;
}
答案 0 :(得分:1)
当然,可以在后台加载图像,但不是这样。设计此方法是为了让不返回nil真的不可能。当您调用dispatch_async
时,它会立即返回并异步完成其工作。这就是为什么它的名字中有“异步”的原因。在加载图片之前,您的代码会达到return image;
。
你应该做的是:
dispatch_async
回到主队列中,做你需要做的任何工作 - 在屏幕上显示它,或者把它写到一个文件,或者你需要做什么图像。void
,因为它无法将图像直接返回给调用者。或者如果您愿意,让它返回BOOL
以指示图像加载是否已启动。但它不能返回UIImage
,除非你让主队列在图像上等待 - 正如我所提到的那样,它违背了使用后台队列的全部目的。