在后台加载Facebook图像以保存到主线程上的Core Data

时间:2013-11-25 06:22:55

标签: facebook image core-data grand-central-dispatch

我正在加载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;
 }

1 个答案:

答案 0 :(得分:1)

当然,可以在后台加载图像,但不是这样。设计此方法是为了让返回nil真的不可能。当您调用dispatch_async时,它会立即返回并异步完成其工作。这就是为什么它的名字中有“异步”的原因。在加载图片之前,您的代码会达到return image;

但是,你走在正确的轨道上。通常的方法是在后台工作完成时调回主队列。但是当这样做时,像你这样的方法不可能返回图像。如果是这样,主队列将不得不等待,直到图像被加载,这违背了在后台队列上运行的全部目的。

你应该做的是:

  1. 在你的dispatch_async回到主队列中,做你需要做的任何工作 - 在屏幕上显示它,或者把它写到一个文件,或者你需要做什么图像。
  2. 使您的方法返回void,因为它无法将图像直接返回给调用者。或者如果您愿意,让它返回BOOL以指示图像加载是否已启动。但它不能返回UIImage,除非你让主队列在图像上等待 - 正如我所提到的那样,它违背了使用后台队列的全部目的。