【问题标题】:Save Facebook friend pictures to documents rapidly快速将 Facebook 好友图片保存到文档
【发布时间】:2013-04-23 13:45:17
【问题描述】:

我没有任何线索,因此我将它交给可以以适当方式帮助我的人。实际上,我已经使用 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 同步过程。

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

有人可以指导我吗?

提前谢谢大家:)

【问题讨论】:

    标签: iphone facebook profile image friend


    【解决方案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;
     });
    });
    

    谢谢,希望对大家有所帮助:)

    【讨论】:

    • +1 为您服务。这是一个快速加载图像的好代码。但我认为这是一个问题。加载视图后,它会获取所有朋友的姓名,但不会获取个人资料照片。只有当我们滚动时,表格才会刷新,然后图像才会开始加载。有什么解决办法吗?
    • @Ajitthala 我们遵循异步加载,因此图像加载可见视图并在我们向下滚动时获取不可见单元的图像,建议异步加载图像是消除性能的最佳方式和内存泄漏问题:)
    • 对我来说,图像也不会为可见视图加载。只有当我向下滚动时,才会显示可见视图的图像。
    • 能否请您提供您的实现代码,以便我查看您的问题
    • 请将您的代码粘贴到pastebin.com并在此处发布链接,我会通过它,请不要邮寄您的项目:)
    【解决方案2】:

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

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

    有一个不错的库 SDWebImage 可以做到这一点。

    【讨论】:

    • 对不起,我没听懂你的意思,你的意思是说,只保存朋友的图片网址
    • 这个变量中的值 NSString *friendPictureString.
    • 以后如何使用这些保存的图片?
    • 但是我如何根据表格视图的行值分配url,我的意思是在索引路径方法的单元格中,我们将访问文档文件夹,但是我如何提供相应的图片,我的意思是各自朋友的正确网址??
    • 您可以将它们存储在 plist 或数组中,然后保存到文件中。这是link 如何将数组作为字符串写入文件
    猜你喜欢
    • 2013-04-24
    • 2019-07-05
    • 1970-01-01
    • 1970-01-01
    • 2022-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多