【问题标题】:How to move to the next page in Facebook JSON response using iOS SDK?如何使用 iOS SDK 移动到 Facebook JSON 响应的下一页?
【发布时间】:2011-06-16 07:46:47
【问题描述】:

在 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 为例。

【问题讨论】:

  • 顺便说一下,你的时间格式只是 URL 编码的。解码它,你会得到这个“2010-09-13T00:25:16+0000”。现在更明显了? :)
  • 是的!我不知道我是怎么错过的。我发布这个已经一年半了。

标签: ios facebook facebook-graph-api facebook-ios-sdk


【解决方案1】:

Facebook 的 iOS SDK 版本 3 发布后,原来的答案不再适用于当前版本。

我不得不做一些挖掘工作,因为新版本并没有让这变得更容易。我在新 SDK 提供的 FBGraphObjectPagingLoader 类中找到了一个如何完成此操作的示例,以帮助对表执行此操作。它非常丑陋,但我认为这是“推荐”的方法,因为这是他们使用的方法。

这是我对其代码的轻微修改(最初在 FBGraphObjectPagingLoader's followNextLink method 中找到)

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];

如果您愿意,当然可以修改他们的库并将其封装在类本身中。

【讨论】:

  • 谢谢,我还没有研究 iOS SDK 3.0,但似乎他们并没有让这变得更容易。
【解决方案2】:

至少就日期格式而言,它是 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"];

使用 NSURL 方法将 URL 分解为字符串字典非常简单。

【讨论】:

    【解决方案3】:

    向 Facebook 子类或自身添加方法所需的一切

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

    ps 第二个参数 "httpMethod" 可能总是@"GET" 你可以省略它

    【讨论】:

    • 哇,效果很好!非常感谢!顺便说一句,为什么 Facebook SDK 不内置这个?你知道这是否是计划中的更新吗?
    • 不,我没有在github.com/facebook/facebook-ios-sdk/issues 找到任何关于该功能的任务,但你可以成为第一个完成它的人)
    • 此答案不再适用于最新版本的 Facebook SDK。我添加了一个新答案,解释了如何在最新版本中完成它。
    【解决方案4】:

    你可以这样做:

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

    请注意,在 Feed 的 paging 部分,nextprevious 网址仅相差一个查询参数(untilsince)。您可以使用从中获取的值来获取下一页和上一页的结果。

    希望这会有所帮助!

    【讨论】:

    • 嗯不适合我,我从 facebook 收到一个错误:无法将 2011-01-27T04%3A48%3A50%2B0000 解析为日期或时间。还有其他想法吗?
    • 嗯,这很奇怪......它以前对我有用。我也会尝试解决这个问题,因为我的项目需要它..会及时更新..
    • 在此页面上搜索“自始至终”:developers.facebook.com/docs/api。它说您可以使用“几乎任何有效的日期格式”。我试过使用“since=yesterday”和“until=yesterday”,它们都有效。我还尝试使用时间戳(在此处转换:epochconverter.com),这也给了我一个有效的时间格式。所以...看起来您可以将其转换为 Unix 时间戳。虽然我认为他们以上述格式提供日期而不接受它很奇怪......需要更多调查......
    • 我其实不太了解时间格式。我正在测试的是 2010-09-13T00%3A25%3A16%2B0000,当我尝试 epochconverter.com 时,它说它是 1970 年 1 月 1 日。这里肯定有问题......我会调查一下还有一点。
    • @donkim 看来 Gaj 已经做到了。虽然我不会说这是一个特别优雅的解决方案(破解 SDK),但我会看看 Facebook 是否有这种方法。
    【解决方案5】:

    是的,你可以通过调用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];
    

    您可以将此代码用于您的目的。

    【讨论】:

    • 这将获得前 150 个状态,对吗?我如何获得下一个 150?
    • 您可以设置一个无限的限制,例如 100000 或更多,但 facebook 提供的最大记录数约为 1 年的状态。您可以通过使用任何 facebook api 获得更多信息,因为他们没有提供超过一年前的数据。
    • 你是什么意思我可以得到比使用任何 facebook api 更多的东西?
    • 对不起其实我想写“你不能得到更多..”
    猜你喜欢
    • 2011-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-15
    • 2012-12-10
    • 2011-09-28
    • 1970-01-01
    相关资源
    最近更新 更多