iOS Facebook SDK - 最佳实践?
Posted
技术标签:
【中文标题】iOS Facebook SDK - 最佳实践?【英文标题】:iOS Facebook SDK - Best Practices? 【发布时间】:2012-03-02 15:39:59 【问题描述】:我想知道使用 Facebook ios SDK 的“最佳实践”指南是什么。
特别 - 我有几个使用 Facebook SDK 的表单。 作为 OOP 程序员,我最初的直觉是在处理所有 Facebook 活动的数据访问层下创建一个“FacebookManager”类。 不幸的是,由于 Facebook iOS SDK 使用了委托和异步方法,这并没有太大帮助,因为任何其他使用 FacebookManager 的模块无论如何都必须为所有响应传递委托。
然后我发现每个 ViewController 本身都是一个 FBRequestDelegate 并处理所有 Facebook 响应。
那么,你是如何在你的应用中做到这一点的呢?
【问题讨论】:
【参考方案1】:我所做的是按照您的建议创建一个 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 函数的最后两行没有反转?您运行请求,然后将块作为参数添加到它?我不明白... 我的理解是请求已准备好,直到下次运行 runloop 时才会执行。这就是为什么它看起来应该在添加块之前发出请求,但实际上它是在添加块之后在运行循环的下一次执行时执行的 我最终使用了您的示例。谢谢。 将异步框架包装成块的有趣方式。 +1。但是,您是否能够将登录方法(授权)包装到块模型中? FBSessionDelegate 方法不返回任何对象... 看起来其他人通过将块存储到管理器上的 ivar 来实现块登录。 ***.com/questions/9561421/…【参考方案2】: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) 如果您的 viewController 需要更多功能,添加包装器会很容易
有很多开源代码可用(搜索 github),但自定义管理器类不难编写,可以轻松移植到其他项目。
希望对你有帮助。
【讨论】:
【参考方案3】:我们已经构建了一个相当广泛的库,可用于 facebook 集成。见这里:
https://github.com/RIKSOF/three20/tree/development/src/extThree20Facebook
它是 Three20 框架的扩展。如果您愿意,您可以轻松地将此库修改为独立于 Three20。
我们基本上已经为每个 Graph API 对象定义了对象。从 Graph API 返回的 JSON 被读入这些对象。
【讨论】:
以上是关于iOS Facebook SDK - 最佳实践?的主要内容,如果未能解决你的问题,请参考以下文章
对于使用 Facebook iOS SDK 的混合 SSO 场景,为我们自己的自定义用户记录生成密码/密钥的最佳方式是啥?
IOS SDK - xcode interface builder - 管理许多对象的最佳实践是啥?