コールバックを介して非常に数行のコードを使用して実行できます。コールバック 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
};
ロジックは正しい場所にあり、認証されていないリクエストを別のケースで別の方法で処理したい場合は、それが可能です。