快速将Facebook好友图片保存到文档中

时间:2013-04-23 13:45:17

标签: iphone facebook profile image friend

我什么都没有任何线索因此我会把它交给一个可以帮助我正确方法的人。实际上我使用FQL查询检索了Facebook好友的详细信息,其中个人资料图片是一个对于我们的不便,该图片是以url的形式检索的。早期阶段,我尝试使用图形api(对象)获取朋友的详细信息,在那里它与服务器的数量一样多次访问服务器。因为它FB朋友需要很长时间才能同步,我向前移动到FQL,这也像我一样烦我。即使我在一个查询中有所有的朋友图片,我也无法将它们转换为图像并保存到文档文件夹迅速。

我正在使用Facebook同步按钮,在该按钮操作中,我将朋友详细信息保存/更新到数据库中,同时将朋友图片保存到文档中。这再次引发了类似的问题,即。花更多的时间来同步。这是我理解的实现代码:

-(void)saveUpdateFriendDetails
{
    for (int index = 0; index<[friendsDetailsArray count]; index++)  
    {
       //Save or update friends details to db

       //Fetch friends picture url,convert to image and save to documents folder
       NSString *friendPictureString = [[self.friendsDetailsArray valueForKey:kPicture]objectAtIndex:index];
       NSURL *friendPhotoUrl = [NSURL URLWithString:friendPictureString];
       NSData *data = [NSData dataWithContentsOfURL:friendPhotoUrl];
       UIImage *friendProfilePicture = [UIImage imageWithData:data];

       NSString *filename = [facebookID stringByAppendingString:kPNG];

       //  Get the path of the app documents directory
       NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES);
       NSString *documentsDirectory = [paths objectAtIndex:0];

       //  Append the filename and get the full image path
       NSString *savedImagePath = [documentsDirectory stringByAppendingPathComponent:filename];

       //  Now convert the image to PNG and write it to the image path
        NSData *imageData = UIImagePNGRepresentation(friendProfilePicture);
        [imageData writeToFile:savedImagePath atomically:NO];
}

我尝试使用GCD和AsyncImageView在后台运行该过程,但即便如此,它也需要相同的时间,因为过程保持不变(最终我们在后台运行,这是唯一的区别)。

那么有没有办法快速将朋友的图片网址转换为照片并保存到文档文件夹,这样就不会影响我的Facebook同步过程。

注意:如果不将照片保存到文档中,我需要大约20-30秒来同步800位朋友,同时保存图像需要2-3分钟。

有人可以指导我。

提前感谢每一位:)

2 个答案:

答案 0 :(得分:1)

Oopa,我找到了解决自己问题的方法

只需忽略将图像保存到文档文件夹,即可提高同步速度。

稍后在使用图像显示细节时,只需使用图形api检索朋友图像,即。只用一行:

NSString *profilePicURL = [NSString stringWithFormat:@"http://graph.facebook.com/%@/picture",friendID];

我们可以在后台使用GCD模型进行异步加载,这样就不会让性能变慢。

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH,  0ul);
        dispatch_async(queue, ^{
NSString *profilePicURL = [NSString stringWithFormat:@"http://graph.facebook.com/%@/picture",friendID];
NSURL *profilePhotoURL = [NSURL URLWithString:profilePicURL];
NSData *photoData = [NSData dataWithContentsOfURL:profilePhotoURL];
dispatch_sync(dispatch_get_main_queue(), ^{
//assign the image to cell here
image = [UIImage imageWithData:photoData];
cell.imageView = image;
 });
});

谢谢,希望这有助于某人:)

答案 1 :(得分:0)

您是否考虑过图片缓存,您只需要存储该网址(或通过userID构建它)并仅在需要时加载它。

图像加载一次后,您将无需再次加载(因为它将存储在手机上)。

有一个很好的库SDWebImage可以做到这一点。