2011-07-26 10 views
0

私は今iPhoneアプリでアプリログインが必要なFacebook機能を実装しています。ログイン自体はもはや問題ではなく、機能しています。非同期イベント(ログイン)にどのように反応するのですか?

しかし、Facebook SDKがイベントで動作するため、ログインに成功するためのアクションとしてどのように行動するかわかりません。例えば

私は方法

- (void)refreshEvents; 

を持っている。この方法は確かにアクションが実際に実行することができることを確認するためにloginメソッドを呼び出す必要があります。だから[self checkLogin]と呼んでいますが、今は何ですか?本当に自分の方法に縛られていないイベントを待つことはできますか? checkLoginは非同期アクション/イベントをトリガするので、ログインが実行されるまで待つように指示することはできません。それが継続できるようにする方法

- (void)request:(FBRequest *)request didLoad:(id)result; 

たアクセストークンを処理しながら、どのように私は、最初のアクションをされているものを、それを伝えることができますか?

私の考えは、「ログイン後に実行するアクション」のキューを保持する配列にインスタンス変数を使用することですが、これは本当に厄介な回避策のようです。あなたの助けのための

おかげ

アルネ

答えて

1

最も簡単な解決策はログインが完了すると、実行することができ、完了ブロックを渡すことであろう。さらに、エラーがあった場合に呼び出されるブロックを渡すこともできます。私のアプリケーションでは、これを「応答者」パターンにラップしています。ここでは、完了とエラーブロックを含むクラスを定義しています。これは引数として非同期メソッドに渡されます。ここで唯一のキャッチは、適切な時点でブロックを実行するログインを記述する必要があることです。

このパターンは、非同期API(Facebook SDKを含む)を使用するアプリケーションで数回実装されています。 (いくつかのコードサンプルを追加しました)

UPDATE:最も単純な形式で

、あなただけの完了ブロックを追加することができます。まず、完成ブロックのtypedefを作成したいと思うでしょう。この場合、我々は値を返さないと、ID入力があるブロック使用します:

typedef void (^successBlock)(id); 

次に、あなたは、Facebookクラスを使用して相互作用のためのファサードを作成するコントローラを作成することができます。

- (void)loginWithCompletionHandler:(successBlock)handler 
{ 
    // If you aren't using ARC - you'll need to use Block_copy(handler) 
    completionHandler = handler; 

    [facebook authorize:facebookSettings.defaultPermissions 
       delegate:self]; 
} 

最後に、あなたのFBSessionDelegateの実装では、あなたがこのブロックを実行することができます:

このファサードでは、この(これはあなたがタイプsuccessBlockのIVARを持っていると仮定し)などの署名を持ってloginメソッドを作成することができます私は上記の
#pragma mark - FBSessionDelegate Implementation 

- (void)fbDidLogin 
{ 
    // Store Facebook token, etc..... 

    if(completionHandler) 
    { 
     // You could pass any data you want in this data property 
     completionHandler(data); 
    } 
} 

}

「応答者のパターンは少しより複雑これ以上であるが、これはあなたが軌道に乗るには十分でなければなりません。

+0

お返事ありがとうございます。私はそのパターンには慣れていません。それをログインと混在させる方法の具体例(擬似コード?)がありますか? – arnekolja

+0

上記のコードをいくつか追加しました。これが正しい方向に向いているかどうかを教えてください。 – dtuckernet

+0

いつ/あなたはcompletionHandlerをクリアする必要がありますか?それを呼び出した後にnilに設定するだけですか? –

関連する問題