Как перейти к следующей странице в ответе JSON Facebook с помощью iOS SDK? - PullRequest
8 голосов
/ 27 января 2011

В Facebook iOS SDK я могу запросить такие запросы:

[_facebook requestWithGraphPath:@"me/feed" andDelegate:self];

Но часто Facebook выдает ограниченный JSON-ответ с URL-адресом, который можно использовать, например, для запроса перехода на более ранние даты. Итак, в ответе JSON у меня будет:

data =     ( /*things here... status updates, photos, etc...*/
    );
paging =     {
        next = "https://graph.facebook.com/me/feed?sdk=ios&sdk_version=2&access_token= <something>&until=2010-12-04";
        previous = "https://graph.facebook.com/me/feed?sdk=ios&sdk_version=2&access_token=<something>&since=<something>";
    };

Что мне интересно ... Как мне перейти на предыдущий URL? Предоставляет ли SDK интерфейс для этого?

РЕДАКТИРОВАТЬ: если возможно, я на самом деле хочу ответить с Graph API, поскольку Facebook в настоящее время не поддерживает REST API.

БОНУС: Если кто-нибудь может объяснить формат времени, возвращенный Facebook. У меня 2010-09-13T00%3A25%3A16%2B0000 в качестве примера.

Ответы [ 5 ]

7 голосов
/ 08 февраля 2011

все, что вам нужно, чтобы добавить метод в подкласс Facebook или сам по себе

- (void)requestWithURLString:(NSString *)fullURL
               andHttpMethod:(NSString *)httpMethod
                 andDelegate:(id <FBRequestDelegate>)delegate {
    [self openUrl:fullURL params:nil httpMethod:httpMethod delegate:delegate];
}

ps второй параметр "httpMethod" может быть всегда @ "GET", вы можете опустить его

6 голосов
/ 01 сентября 2012

С выходом iOS SDK Facebook версии 3 исходный ответ больше не применяется к текущей версии.

Мне пришлось немного покопаться, потому что новая версия не облегчает эту задачу. Я нашел пример того, как сделать это в классе FBGraphObjectPagingLoader, который новый SDK предоставляет, чтобы помочь сделать это для таблиц. Это невероятно некрасиво, но я предполагаю, что это «рекомендуемый» метод, потому что это то, что они используют.

Вот моя небольшая модификация их кода (изначально найдена в метод followNextLink * FBGraphObjectPagingLoader )

FBRequest *request = [[[FBRequest alloc] initWithSession:FBSession.activeSession graphPath:nil] autorelease];
FBRequestConnection *connection = [[[FBRequestConnection alloc] init] autorelease];
[connection addRequest:request completionHandler:^(FBRequestConnection *connection, id result, NSError *error) {
     // Do some stuff
 }];

// Override the URL using the one passed back in 'next'.
NSURL *url = [NSURL URLWithString:urlString];
NSMutableURLRequest* urlRequest = [NSMutableURLRequest requestWithURL:url];
connection.urlRequest = urlRequest;

[connection start];

Конечно, вы можете изменить их библиотеку и инкапсулировать это в самом классе, если хотите.

2 голосов
/ 04 февраля 2011

Вы можете сделать что-то вроде этого:

[appDelegate.fb requestWithGraphPath:@"me/home"
                           andParams:[NSMutableDictionary dictionaryWithObject:@"2011-01-27T04%3A48%3A50%2B0000" forKey:@"since"]
                         andDelegate:self];

Обратите внимание, что в части paging вашего фида URL next и previous отличаются только одним параметром запроса (until и since).Вы можете использовать значения, которые вы взяли из этого, чтобы получить следующую и предыдущую страницу результатов.

Надеюсь, это поможет!

1 голос
/ 03 февраля 2011

Да, вы можете получить результат, вызвав функцию в API Я использовал код ниже, чтобы получить статусы пользователей, в вашем случае вы можете использовать метод stream.get, который вы можете найти здесь http://developers.facebook.com/docs/reference/rest/stream.get/

NSMutableDictionary * params = [[NSMutableDictionary alloc] init];
    [params setValue:[NSString stringWithFormat:@"%@", appDelegate.user_id] forKey:@"uid"];
    [params setValue:@"150" forKey:@"limit"];
    [params setValue:@"results" forKey:@"callback"];


    [_facebook requestWithMethodName: @"status.get"
       andParams: params
       andHttpMethod: @"POST"
                         andDelegate: self];

Вы можете использовать этот код для своих целей.

0 голосов
/ 23 ноября 2011

По крайней мере, что касается формата даты, это вариант формата RFC 3339. Насколько я знаю, в iOS нет предопределенного форматера этого типа.

Я создаю форматировщик даты и сохраняю его (они, как ни странно, медленно создаются), чтобы я мог легко конвертировать их при работе с данными FB.

        NSDateFormatter * sRFC3339DateFormatter = nil;
        NSLocale * enUSPOSIXLocale;

        sRFC3339DateFormatter = [[NSDateFormatter alloc] init];
        enUSPOSIXLocale = [[[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"] autorelease];

        [sRFC3339DateFormatter setLocale:enUSPOSIXLocale];
        [sRFC3339DateFormatter setDateFormat:@"yyyy'-'MM'-'dd'T'HH':'mm':'ssZ"];
        [sRFC3339DateFormatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];

Если у вас есть такой форматтер, вы можете легко конвертировать туда и обратно.

NSDate* myDate = nil;
myDate = [sRFC3339DateFormatter dateFromString:@"2011-01-27T04%3A48%3A50%2B0000"];

Разбить URL на словарь строк довольно просто с помощью методов NSURL.

...