2012-03-02 13 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インタラクションをView Controllerから離しておくことは大丈夫です。

注すべてのコードはここに

+0

なぜPostToWall関数の最後の2行が反転していませんか?あなたは要求を実行し、ブロックにパラメータとしてブロックを追加しますか? 私はそれを取得しません... –

+0

私の理解は、要求が準備され、runloopが次に実行されるまで実行されません。だからこそ、ブロックが追加される前にリクエストが出て行くように見えるのですが、実際には、ブロックが追加された後に実行ループの次のステップで実行されます。 – ribeto

+0

私はあなたの例を使って終わりました。ありがとう。 –

0

Facebookのマネージャー何のリリースが存在しない理由ですARCを前提とし、FacebookのSDKを超える基本的にラッパーが移動するための方法です。それを管理する方法のヒントをいくつか紹介します。

1)Facebook SDKのプロトコル定義を変更して、必要でないものをオプションにして、実装する必要がなくなります。

2)このマネージャクラスのすべてのセッションアクティビティ、ログイン/ログアウト、デリゲート、プロトコルなどを処理します。言い換えれば、このマネージャは、Facebook sdkによって定義されたすべてのプロトコルを実装します。

3)マネージャクラスで独自のプロトコルを定義し、すべてのプロトコルメソッドをオプションにして、すべてのView Controllerが実際に必要なものを定義できるようにします。

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は、これらのオブジェクトに読み込まれます。

関連する問題