6

私のアプリデリゲートでは、データモデルを作成し、それをストーリーボードから取得したルートビューコントローラーに挿入し、最初から必要に応じてユーザーの資格情報を要求します。その後、いくつかのデータ モデル メソッドにアクセスするときに、ユーザーのパスワードを確認し、パスワードの再確認をトリガーする要求を再試行する必要がありました。

最も明白なのは、この情報を要求する必要がある可能性のある各ビュー コントローラーにこの機能を組み込むことですが、コントローラーの汎用性が低下し、テストが難しくなるため、これはできるだけ避けたいと考えています。私の考えでは、コントローラーは、与えられたモデルの内部の仕組みについて何も知っていてはなりません。

この機能をモデルに追加することも、私には適切ではありません。ユーザー インタラクションの管理は、MVC のモデルの責任を超えています。

ユーザーが資格情報を入力できるように、対応するビュー コントローラーを使用してモーダル ダイアログを表示するのは誰の責任ですか?

4

3 に答える 3

3

コールバックを介して非常に数行のコードを使用して実行できます。コールバック API はモデル レイヤーで定義されますが (再利用可能)、ユーザー インタラクションはコントローラー レベルで実装されます (それが属する場所であるため)。

あなたの説明に基づいて、あなたのアーキテクチャが正確にどのように見えるかは完全にはわかりません.アプリは、リクエストが失敗した場合にのみ認証されていないことを認識していると思います(トークンの有効期限を保存して、可能であればそれを活用することをお勧めします) .

基本的な考え方:

モデルには、コールバック ブロック プロパティがあります (たとえば、クライアント クラスまたは使用するその他のパタ​​ーン)。

@property (nonatomic, copy) void (^onNonauthenticatedRequest)(NSURLRequest *failedRequest, NSError *error);

ユーザーが認証されていないためにリクエストが失敗した場合、モデル層でこのブロックを実行します。

コントローラー レベルでは、ユーザーに資格情報の入力を求めるコントローラーがあります (同様のコールバック パターンがあります)。

client.onNonauthenticatedRequest = ^(NSURLRequest *failedRequest, NSError *error) {

    ABCredentialsViewController *credentialsViewController = [ABCredentialsViewController new];
    credentialsViewController.onAuthenticationSuccess = ^{
        // This gets called after the authentication request succeeded
        // You want to refire failedRequest here
        // Make sure you use a weak reference when using the object that owns onAuthenticationFailure
    };

    credentialsViewController.onAuthenticationFailure = ^(NSError *) {
        // You might want to do something if the user is not authenticated and failed to provide credentials
    }

    [[UIApplication sharedApplication].delegate.window.topViewController presentViewController:credentialsViewController animated:YES];
    // or you could just have a method on UIViewController/your subclass to present the credentials prompt instead
};

ロジックは正しい場所にあり、認証されていないリクエストを別のケースで別の方法で処理したい場合は、それが可能です。

于 2013-11-05T03:44:03.083 に答える
1

ここでの大きな要件の 1 つは、同じモーダル ダイアログを表示する必要がある可能性がある複数のコントローラーがあることです。私には、デリゲート パターンがうまく機能するように思えます。ここでの考え方は、必要に応じて各コントローラーが使用できる単一のモーダル ダイアログ処理機能を保持することです。また、UITableViews や日付ピッカーなどの UIKit 内部で使用されるパターンと同じです。 https://developer.apple.com/library/ios/documentation/general/conceptual/CocoaEncyclopedia/DelegatesandDataSources/DelegatesandDataSources.htmlで概要を説明しています。

于 2013-10-31T17:44:12.903 に答える