1

私はこれまでに何の手がかりも持っていないので、適切な方法で私を助けることができる誰かにそれを与えています.実際、私はFQLクエリを使用してFacebookの友達の詳細を取得しました。申し訳ありませんが、写真はURLの形式で取得されます。前の段階で、グラフAPI(オブジェクト)を使用して友達の詳細を取得しようとしましたが、ここで友達の数だけサーバーにヒットします.時間がかかるためFB の友達が同期されるように、FQL に移行しましたが、これも私を悩ませています。1 つのクエリですべての友達の写真を取得しているにもかかわらず、それらを画像に変換してドキュメント フォルダーにすばやく保存することができません。

私は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の同期プロセスに影響を与えないように、友達の写真のURLを写真にすばやく変換してドキュメントフォルダーに保存する方法はありますか.

注: 写真をドキュメントに保存しないと、800 人の友人を同期するのに約 20 ~ 30 秒かかり、画像を保存する場合も 2 ~ 3 分かかります。

誰かが私を案内してくれませんか。

事前に感謝します:)

4

2 に答える 2

1

おっと、私は自分の問題の解決策を見つけました

ドキュメント フォルダへの画像の保存を無視するだけで、同期速度が向上します。

後で画像付きの詳細を表示するときに、グラフ API を使用して、つまり 1 行でフレンドの画像を取得するだけです。

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 を保存 (またはユーザー ID で作成) し、必要なときにのみロードするだけで済みます。

画像が一度読み込まれると、再度読み込む必要はありません (電話に保存されるため)。

これを行う素敵なライブラリSDWebImageがあります。

于 2013-04-23T13:57:48.063 に答える