0

私は、主に内部システムにインストールされる API で動作するアプリに取り組んでいます。API は、公共のインターネット経由でもアクセスできます。クライアントは、内部 URL と外部 URL の可用性に応じてアプリが接続する内部 URL と外部 (パブリック インターネット) URL の両方をユーザーが入力できるようにしたいと考えています。

アプリは基本的に完了していますが、現在はすべての API 呼び出しに対してのみ内部 URL に接続しています。API 呼び出しごとにブロックベースの完了/失敗呼び出しで AFNetworking を使用しています。

私たちが設計したロジックに基づいて、アプリはサーバーの現在の時刻を照会することにより、API の可用性を常にチェックします。これは、 を呼び出すことによって行われhttp://internal_url/api/timeます。この API が適切な応答を返さない場合は、外部 URL に切り替えて、http://external_url/api/timeその URL で同じ API を呼び出します。両方が失敗した場合、アプリはそれに応じてユーザーに通知し、API に対して他のクエリを実行しません。

あまり明らかにすることなく、API 呼び出しが現在どのように設定されているかについてのコードを次に示します。

- (void)someAPIMethodCall:(NSDictionary *)parameters completionBlock:block failure:block {
// query /api/time and return the URL (internal/external) that is currently up

AFHTTPClient *client = [AFHTTPClient clientWithBaseURL:<url returned from above query>];
[client operationWithSuccess:block failure:block];
}

私の質問は次の/api/timeとおりです。上記のクエリメソッドを機能させる最良の方法は何ですか? 明らかに、このメソッドは、内部/外部 URL を完了して返す必要があります。これにより、後続の実際の API クエリが使用できるようになります。AFAIK、AFNetworking呼び出しはブロックベースであるため、上記が戻る前に/api/time戻ります。NSURLConnection を同期的に使用する別のクラスも考えました。これにより、メインスレッドが返されるのを待っている間、メインスレッドがブロックされます/api/time

4

1 に答える 1