0

私のアプリでは、作成したコンテンツを Facebook、Twitter、電子メール、SMS で共有できます。これらの各オプションには、対応する UISwitch があります。ユーザーはすべてのスイッチを構成し、[完了] ボタンを押します。各スイッチについて、「ON」に設定されている場合は、適切なメソッド ( shareViaSmsshareViaEmailなど) を起動します。このメソッドは、ネイティブ iOS ビューコントローラーをインスタンス化して、そのタイプの共有 (TWTweetComposeViewController、MFMailComposeViewController など) を実現します。これらの viewController には、完了を通知するデリゲート コールバックがあり、1 つが完了すると (誰かが電子メール作成シートを送信またはキャンセルすると)、次の使用を開始する必要があります。

これを管理する私の現在のコードは扱いにくいと感じており、より良い解決策を探しています。ユーザーが 4 つのオプションをすべてオンにするとshareViaFacebook.、デリゲート メソッドを持つ最初の共有メソッドを呼び出します。完了したら、次の共有オプションの UISwitch ステータスを確認し、オンの場合はその共有メソッドを呼び出し、そうでない場合は、その共有メソッドを呼び出します。次のスイッチなどを確認します。各デリゲートの完了メソッドは残りのスイッチをループし、次の共有メソッドの呼び出しを担当します。ご想像のとおり、新しいオプションを追加するには、多くのコードを変更し、多くの if/else 条件を変更する必要があります。

どうすればこれを改善できますか? すべての UISwitches を簡単に確認できるようにしたいと考えています。「ON」に設定されている場合は、対応する共有メソッド ( shareViaSMS) をキューに追加し、そのキューを実行して、前の共有メソッドが次の共有メソッドを自動的に呼び出すようにしたいと考えています。 1つが完了します。前述のように、完了は非同期であり、デリゲート コールバックを介して通知されるため、苦労しています。

4

1 に答える 1

1

これには、必要な特定のリクエストを開始するために必要なすべての情報(サービスの名前、テキスト、タイトルなど)を含む「リクエスト」オブジェクトを受け入れる「マネージャー」オブジェクトが必要です。

「マネージャー」オブジェクトには、リクエスト オブジェクトでロードするタスクの配列が含まれており、デリゲートを使用して再帰性を使用し、リクエストが完了するとすぐにポップアウトする必要があります。

デリゲートは、マネージャー内で次のようなメソッドを呼び出す必要があります。

リクエストが正常に完了した場合は、スタックのトップをポップし、マネージャのスタック リクエスト メソッドのトップを実行するを再度呼び出します。

リクエストが失敗した場合は、停止してメッセージを送信します。

スタックが null の場合、すべてのリクエストが実行されています。

もちろん、マネージャーは、各タイプの要求を処理するための適切なコードを用意する必要があります。

このアーキテクチャを使用している場合、新しいサービスの追加は、そのタイプのリクエストを管理するコードをマネージャー オブジェクトに追加するだけで簡単です。

ところで、これはキューを作成する多くの方法の 1 つです。言語に依存せず、私の意見では理解しやすいので、この方法をお勧めします。

于 2013-01-23T03:31:08.877 に答える