2012-03-02 207 views
11

我想知道什麼是「最佳實踐」的指導方針是使用Facebook的iOS SDK。iOS Facebook SDK - 最佳實踐?

特別是 - 我有幾種使用Facebook SDK的形式。 我最初的本能,作爲程序員OOP正在處理所有Facebook的活動我的數據訪問層來創建一個「FacebookManager」級。 不幸的是,因爲Facebook的iOS版SDK使用委託和異步方法,這不是那麼有用,因爲使用FacebookManager會有任何其他模塊中的代表通過對所有答覆反正。

然後我覺得每個ViewController本身就是一個FBRequestDelegate並處理所有Facebook響應。

那麼,你是如何做到這一點在你的應用程序?

回答

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這就是爲什麼沒有發佈

+0

爲什麼PostToWall函數中的最後兩行沒有反轉?你運行請求然後添加塊作爲參數給它? 我不明白... – 2012-03-02 16:36:06

+0

我的理解是,請求會被準備好,直到下一次runloop運行纔會執行。這就是爲什麼它看起來請求應該在塊添加前結束,但實際上它是在塊添加後在運行循環的下一步執行的。 – ribeto 2012-03-02 19:31:39

+0

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

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

很多開放源代碼是添加包裝可用(搜索github),但自定義管理員類不難編寫,並可輕鬆移植到其他項目。

希望它有幫助。

0

我們已經建立了一個相當廣泛的庫,可以用於facebook集成。在這裏看到:

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

及其對Three20框架的延伸。如果你喜歡,你可以很容易地修改這個庫以獨立於Three20。

我們基本上已經爲每個Graph API對象定義了對象。從Graph API返回的JSON被讀入這些對象。