iOS Facebook SDK - 最佳实践?

问题描述:

我想知道什么是“最佳实践”的指导方针是使用Facebook的iOS SDK。iOS Facebook SDK - 最佳实践?

特别是 - 我有几种使用Facebook SDK的形式。 我最初的本能,作为程序员OOP正在处理所有Facebook的活动我的数据访问层来创建一个“FacebookManager”级。 不幸的是,因为Facebook的iOS版SDK使用委托和异步方法,这不是那么有用,因为使用FacebookManager会有任何其他模块中的代表通过对所有答复反正。

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

那么,你是如何做到这一点在你的应用程序?

我所做的是按照您的建议创建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这就是为什么没有发布

+0

为什么PostToWall函数中的最后两行没有反转?你运行请求然后添加块作为参数给它? 我不明白... – 2012-03-02 16:36:06

+0

我的理解是,请求会被准备好,直到下一次runloop运行才会执行。这就是为什么它看起来请求应该在块添加前结束,但实际上它是在块添加后在运行循环的下一步执行的。 – ribeto 2012-03-02 19:31:39

+0

我最终使用了你的例子。谢谢。 – 2012-03-11 08:54:10

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)这将是容易,如果你需要更多的功能,为您的viewControllers

很多开放源代码是添加包装可用(搜索github),但自定义管理员类不难编写,并可轻松移植到其他项目。

希望它有帮助。

我们已经建立了一个相当广泛的库,可以用于facebook集成。在这里看到:

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

及其对Three20框架的延伸。如果你喜欢,你可以很容易地修改这个库以独立于Three20。

我们基本上已经为每个Graph API对象定义了对象。从Graph API返回的JSON被读入这些对象。