0

現在、アプリのログインが必要な Facebook 機能を iPhone アプリに実装しています。ログイン自体はもはや問題ではなく、機能しています。

しかし、Facebook SDK はイベントを処理するため、ログインの成功に対する反応としてアクションを実行する方法がわかりません。

例えば:

方法があります

- (void)refreshEvents;

このメソッドは login メソッドを呼び出して、アクションが実際に実行できることを確認する必要があります。だから私は電話します[self checkLogin]-しかし、今は何ですか?メソッドに実際にはバインドされていないイベントを待つにはどうすればよいですか? checkLogin は非同期アクション/イベントをトリガーするため、ログインが実行されるまで待機するように指示することはできません。

メソッドでは

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

結果のアクセストークンを処理している間、最初のアクションが何であったかをどのように伝えることができるので、続行できますか?

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

ご協力いただきありがとうございます

アルネ

4

1 に答える 1

1

最も簡単な解決策は、ログインが完了すると実行できる完了ブロックを渡すことです。さらに、エラーが発生した場合に呼び出されるブロックを渡すことができます。私のアプリケーションでは、完了ブロックとエラー ブロックを含むクラスを定義する「レスポンダー」パターンにこれをラップしました。これは、非同期メソッドに引数として渡されます。ここでの唯一の問題は、適切なタイミングでブロックを「実行」するためにログインを記述する必要があることです。

非同期 API (Facebook SDK を含む) を使用するアプリケーションで、このパターンを数回実装しました。

更新 (いくつかのコード サンプルを追加):

最も単純な形式では、補完ブロックを追加するだけです。まず、完了ブロックの typedef を作成します。この場合、値を返さず、id 入力を持つブロックを使用します。

typedef void (^successBlock)(id);

次に、Facebook クラスとの対話用のファサードを作成するコントローラーを作成できます。このファサードでは、次のような署名を持つログイン メソッドを作成できます (これは、successBlock タイプの iVar があることを前提としています)。

- (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 実装で、次のブロックを実行できます。

#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);
    }
}

}

上で述べた「レスポンダー」パターンは、これよりも少し複雑ですが、理解するにはこれで十分です。

于 2011-07-26T13:57:06.857 に答える