0

現在、getMutualFriends メソッドを最適化しようとしています。「Friends」View Controllerを開くと、ユーザーが現在持っているすべての友達に対してgetMutualFriendsメソッドを実行します...これは最適ではありません...しかし、最も簡単な解決策でした...

私がしたことは次のとおりです。

[CBUtility queryForFriends:[PFUser currentUser] block:^(NSArray *friends, NSError *error) {
    [self.friendsActivityIndicator stopAnimating];
    if (error) {
        [[[UIAlertView alloc] initWithTitle:@"Error"
                                    message:[error localizedDescription]
                                   delegate:nil cancelButtonTitle:@"Okay"
                          otherButtonTitles:nil]
         show];
        return;
    }

    if ([friends count] == 0 || !friends) {
        [self.friendsTable addSubview:self.friendsEmptyView];
        return;
    }

    self.friends = [NSMutableArray arrayWithArray:friends];

    [self.friendsTable reloadData];
    [self.friendsEmptyView removeFromSuperview];
    int i = 0;

    //
    // THIS IS THE PART THAT SUCKS!!!
    //
    for (PFObject * friendObject in self.friends) {
        [CBUtility queryForMutualFriends:[friendObject objectForKey:kCBFriendToUserKey] block:^(int mutualFriends, NSError *error) {
            if (error) {
                [[[UIAlertView alloc] initWithTitle:@"Error" message:[error localizedDescription] delegate:nil cancelButtonTitle:@"Okay" otherButtonTitles:nil] show];
                return;
            }

            CBFriendsCell *cell = (CBFriendsCell *)[self.friendsTable cellForRowAtIndexPath:[NSIndexPath indexPathForRow:i inSection:0]];
            [cell setMutualFriends:mutualFriends];

        }];
        i++;
    }
}];

そして、+(void)queryForMutualFriends次のようになります。

+ (void)queryForMutualFriends:(PFUser *)user block:(void (^)(int number, NSError *error))completionBlock
{

    PFQuery *usersFriends = [PFQuery queryWithClassName:kCBFriendClassKey];
    [usersFriends whereKey:kCBFriendFromUserKey equalTo:user];
    [usersFriends whereKey:kCBFriendStatusKey equalTo:kCBFriendStatusFriendKey];

    PFQuery *currentUsersFriends = [PFQuery queryWithClassName:kCBFriendClassKey];
    [currentUsersFriends whereKey:kCBFriendFromUserKey equalTo:[PFUser currentUser]];
    [currentUsersFriends whereKey:kCBFriendStatusKey equalTo:kCBFriendStatusFriendKey];
    [currentUsersFriends whereKey:kCBFriendToUserKey matchesKey:kCBFriendToUserKey inQuery:usersFriends];
    [currentUsersFriends countObjectsInBackgroundWithBlock:^(int number, NSError *error) {
        if (!error) {
            completionBlock(number, error);
            return;
        }
        completionBlock(-1, error);
    }];

}

したがって、ループを実行して個々の PFUser オブジェクトを getMutualFriends メソッドに渡す代わりに、友人の配列をメソッドに渡し、キーが「user」と「count」である辞書オブジェクトの配列とそれぞれの値を返したいと思います。 (例えば@[@{@"user":somePFUser, @"count":5}, @{@"user":anotherPFUser, @"count":20}];

つまり、これは現時点では問題なく動作しますが、API リクエストが多すぎます...

PFQuery のセットアップ方法についてアイデアを持っている人はいますか?

編集:

これは、同じ問題を解決する SQL クエリへのリンクです。

4

1 に答える 1

0

いいえ、明らかにできません...しかし、私のように相互の友達を取得するときに相互の友達を照会する代わりに、サーバーに照会する回数を制限できます。代わりに、結果をメモリにキャッシュします...

セル属性を設定するときに cellForIndexPath でクエリを作成することで、この問題を解決しました。セルが読み込まれると、最初にキャッシュをチェックして、クエリが既に作成されているかどうかを確認します。作成されている場合は、キャッシュ データを取得します...作成されていない場合は、サーバーにクエリを作成します... issue のみ更新されていないことがわかります...キャッシュを毎分クリアできると思うので、リロードボタンを押す代わりに、ユーザーが自動的に更新されます。

于 2015-01-23T22:25:49.940 に答える