1

我没有任何线索,因此我将它交给可以帮助我以适当方式的人。实际上,我已经使用 FQL 查询检索了 Facebook 朋友的详细信息,其中个人资料图片是该字段之一,给我们带来的不便,图片是以url的形式检索的。早期阶段,我尝试使用graph api(object)获取朋友的详细信息,它访问服务器的次数与朋友数一样多。因为它需要很长时间为了让 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 同步过程。

注意:在不将图片保存到文档的情况下,同步 800 位好友大约需要 20-30 秒,保存图片也需要 2-3 分钟。

有人可以指导我。

提前感谢每一位 :)

4

2 回答 2

1

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

只需忽略将图像保存到文档文件夹,这将提高我们的同步速度。

稍后在使用图像显示详细信息时,只需使用图形 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;
 });
});

谢谢,希望这对某人有帮助:)

于 2013-04-23T14:40:12.403 回答
0

您是否考虑过Image Caching,您只需要存储 URL(或通过 userID 构造它)并仅在需要时加载它。

一旦图像加载一次,您就不需要再次加载它(因为它会存储在手机上)。

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

于 2013-04-23T13:57:48.063 回答