2015-04-28 2 views
1

Я пытаюсь получить список «taggable_friends» из Facebook, где может быть более 1000 знакомых друг другу друзей, поэтому Facebook разбивает страницы на результаты. Вот этот метод.iOS: fetch Друзья Facebook с разбивкой по страницам, используя 'next'

-(void)getsFbTaggableFriends:(NSString *)nextCursor dicFBFriends:(NSMutableArray *) dicFriends failure:(void (^) (NSError *error))failureHandler 
{ 
    NSString *qry = @"/me/taggable_friends"; 
    NSMutableDictionary *parameters; 

    if (nextCursor == nil) { 
     parameters = nil; 
    } 
    else { 
     parameters = [[NSMutableDictionary alloc] init]; 
     [parameters setValue:nextCursor forKey:@"next"]; 
    } 


    [FBRequestConnection startWithGraphPath:qry 
           parameters:parameters 
           HTTPMethod:@"GET" 
          completionHandler:^(
               FBRequestConnection *connection, 
               id result, 
               NSError *error 
              ) { 
           if (error) { 
            NSLog(@"%@", [error localizedDescription]); 

           }else { 
            /* handle the result */ 
            NSMutableDictionary *mDicResult = [[NSMutableDictionary alloc]initWithDictionary:result]; 

            for (NSDictionary * fbItem in [mDicResult valueForKey:@"data"]) 
            { 
             [dicFriends addObject:fbItem]; 
            } 
            // if 'next' value is found, then call recursively 

            if ([[mDicResult valueForKey:@"paging"] objectForKey:@"next"] != nil) { 

             NSString *nextCursor = mDicResult[@"paging"][@"next"]; 
             NSLog(@"next:%@", [nextCursor substringFromIndex:27]); 

             [self getsFbTaggableFriends:nextCursor dicFBFriends:dicFriends failure:^(NSError *error) { 
              failureHandler(error); 
             }]; 
            } 
           } 
          }]; 
} 

Проблема: я получаю первые 1000 записей в «результате» объект и значение «следующего» ключ передается в качестве параметра «параметров» для рекурсивного вызова. Однако вторая итерация не разбивается на страницы. & продолжает возвращать одни и те же 1000 записей.

Я также попытался использовать значение nextCursor как параметр startWithGraphPath для второго вызова. Результатом был другой объект ответа с такими ключами, как og_object, share, id вместо data & paging.

Пожалуйста, помогите правильно найти знакомых с тегами страниц за страницей, если в объекте ответа присутствует «следующее». Спасибо.

+0

Документация по API facebook для IOS SDK Говорится ли что-то о том, как справиться с разбиением на страницы? И это SDK 3.x или 4.x? – auspicious99

+0

Мы используем 3.x. – chit

ответ

1

Использовать возвращенную конечную точку next (участок участка графика, включая курсор), в качестве нового пути графа для последующего запроса, вместо этого помещая его в качестве параметра.

+0

Tried & получил объект ответа с ключом «og_object/share/id» вместо «data/paging». – chit

+0

'if ([[mDicResult valueForKey: @" paging "] objectForKey: @" next "]! = Nil) { NSString * nextCursor = mDicResult [@" paging "] [@" cursors "] [@" после " ]; [self getsFbTaggableFriends: nextCursor dicFBFriends: dicFriends failure:^(ошибка NSError *) { failureHandler (ошибка); }]; } ' –

+0

Скорее всего, с результатом' og_object' имеет неправильное форматирование. Обратите внимание, что при передаче в качестве параметра «путь к графу» он должен содержать только путь, т. Е. Без https://graph.facebook.com –

0

Я столкнулся со всеми ответами. Большинство ответов указывают на разбиение на страницы на основе URL или функцию рекурсивного вызова. Мы можем сделать это из самого SDK Facebook.

 var friendsParams = "taggable_friends" 

    // Save the after cursor in your data model 
    if let nextPageCursor = user?.friendsNextPages?.after { 
     friendsParams += ".limit(10)" + ".after(" + nextPageCursor + ")" 
    } else { 
     self.user?.friends.removeAll() 
    } 
    let requiredParams = friendsParams + "{id, name, first_name, last_name, picture.width(200).height(200)}" 
    let params = ["fields": requiredParams] 
    let _ = FBSDKGraphRequest(graphPath: "me", parameters: params).start { connection, response, error in 
     if connection?.urlResponse.statusCode == 200 { 
      print("\(response)") 
      // Update the UI and next page (after) cursor 
     } else { 
      print("Not able to fetch \(error)") 
     } 
    } 

Вы также можете найти пример проекта here

Смежные вопросы