iOS Facebook SDK - 最佳实践?

11

我想知道使用Facebook iOS SDK的“最佳实践”准则是什么。

具体来说-我有几个表单使用了Facebook SDK。作为一个面向对象程序员,我的第一反应是在数据访问层下创建一个名为“FacebookManager”的类来处理所有Facebook活动。但不幸的是,由于Facebook iOS SDK使用委托和异步方法,因此这并没有什么帮助,因为任何使用FacebookManager的其他模块都必须为所有响应传递委托。

然后,我想每个ViewController本身就是FBRequestDelegate并处理所有Facebook响应。

那么,在您的应用程序中如何实现呢?

3个回答

5
我已经按照你的建议创建了一个FacebookManager。这个管理器成为了FBRequestDelegate。现在我更喜欢使用块代替委托模式,因此我的所有FacebookManager方法都是基于块的。
以下是我发布到用户墙上的方法示例:
- (void)postToUserWall:(NSDictionary*)postDictionary withCompleteHandler:(void(^)(id result, NSError* error))block {


  if( [facebook_ isSessionValid] ) {
    NSMutableDictionary* params = [postDictionary mutableCopy];
    [params setObject:facebook_.accessToken forKey:@"access_token"];
    FBRequest* request = [facebook_ requestWithGraphPath:@"me/feed" andParams:[postDictionary mutableCopy] andHttpMethod:@"POST" andDelegate:self];
    [[request params] setObject:block forKey:@"result"];
  }

}

当成功或错误发生时,我只需执行该代码块

- (void)processRequest:(FBRequest*)request withResult:(id)result andError:(NSError*)error {
  NSDictionary* params = [request params];
  if( [request params] != nil && [params objectForKey:@"result"] != nil ) {
    void(^completeBlock)(id result,NSError* error) = [params objectForKey:@"result"];
    completeBlock(result, nil);
  }
}


- (void)request:(FBRequest *)request didLoad:(id)result {
  [self processRequest:request withResult:result andError:nil];
}


- (void)request:(FBRequest *)request didFailWithError:(NSError *)error {
  [self processRequest:request withResult:nil andError:error];
}

我希望有更好的方法来处理阻塞,但这是目前我找到的最好的方法。这是最好的方式吗?可能不是,但这是我目前使用的,它似乎可以让所有FB交互远离我的视图控制器。

请注意,此处的所有代码都假定ARC,因此没有释放。


为什么PostToWall函数中的最后两行没有颠倒顺序?你先运行请求,然后将块作为参数添加到其中?我不明白... - Roey Lehman
我的理解是,请求被准备好了,直到下一次运行循环才会执行。这就是为什么看起来请求应该在块添加之前发送,但实际上是在添加块后的下一次运行循环中执行。 - ribeto
最终我使用了你的例子。谢谢。 - Roey Lehman
有趣的方式将他们的异步框架包装成块。+1。但是,您能否将登录方法(授权)包装到块模型中?FBSessionDelegate方法不返回任何对象... - Joel
看起来有人通过将块存储到管理器的ivar上来实现了阻止登录。http://stackoverflow.com/questions/9561421/any-way-to-have-completionhandler-style-syntax-using-facebook-authorize-on-ios - Joel

0

使用Facebook管理器,基本上是Facebook SDK的包装器,这是一个好方法。以下是如何管理它的一些提示。

1)修改Facebook SDK的协议定义,并将您不需要的协议设置为可选项,以便您无需实现它们。

2)在此管理器类中处理所有会话活动、登录/注销、委托、协议等。换句话说,该管理器实现了Facebook SDK定义的所有协议。

3)在管理器类中定义自己的协议,并使所有协议方法都是可选的,以便每个视图控制器可以定义它实际需要的内容。

4)一些有用的包装器将非常有用,例如:

- (void) postToFriend: (Record*) f_record withMessage: (NSString*) message;
- (void) resumeSession; // checks, resumes session, extend token, or report error

5) 如果您需要为您的视图控制器添加更多功能,添加包装器将非常容易。

有很多开源代码可用(搜索github),但编写自定义管理类并可以轻松移植到其他项目。

希望这有所帮助。


0
我们已经构建了一个相当广泛的库,可供Facebook集成使用。请看这里:

https://github.com/RIKSOF/three20/tree/development/src/extThree20Facebook

这是在Three20框架上的扩展。如果你希望,你可以很容易地修改这个库使其独立于Three20。

基本上,我们为每个Graph API对象定义了对象。从Graph API返回的JSON数据将会被读入到这些对象中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接