their exampleで提案されているシングルトンモデルのAFNetworkingを使用しています。AFNetworking baseURLを変更する
+ (SGStockRoomHTTPClient *)sharedClient
{
static SGStockRoomHTTPClient *_sharedClient = nil;
static dispatch_once_t oncePredicate;
dispatch_once(&oncePredicate, ^{
NSString *baseUrlString = [[NSUserDefaults standardUserDefaults] stringForKey:@"server_root_url_preference"];
_sharedClient = [[self alloc] initWithBaseURL:[NSURL URLWithString:baseUrlString]];
});
return _sharedClient;
}
- (id)initWithBaseURL:(NSURL *)url {
self = [super initWithBaseURL:url];
if (!self) {
return nil;
}
[self registerHTTPOperationClass:[AFJSONRequestOperation class]];
[self setDefaultHeader:@"Accept" value:@"text/html"];
return self;
}
初期化は、ユーザーのデフォルトから取得したbaseURLで行います。
私の問題は、baseURLプロパティが読み取り専用であることです。ユーザーが設定に行き、baseURLユーザーのデフォルトを変更した場合、クライアントでどのように変更できますか?
私がbaseURLを変更する必要がある別の同様のケースは、適切なbaseURLを判断するために複数の呼び出しとロジックを必要とするAPIです。また、アプリが実行されている間もベースURLは変更できます(たとえば、ユーザーが外部プロキシサーバー経由でローカル接続から3G接続に変更する必要のあるネットワーク環境を変更するなど)。
なぜ私はbaseURLプロパティが読み取り専用であるのか分かります。バックグラウンドで実行され、その設定に結びついているnetworkReachabilityStatusのようなものがあります。これは、監視を停止し、値を変更し、再度監視を開始するsetBaseURLメソッドを使用することはかなり簡単です...
私はこのケースではシングルトンをあきらめなければならないと思います。 baseURLを変更するたびにクライアントを再作成しますか?
、質問はAFNetworkingに非常に固有のものです:どのように1は、固定されたベースURLが、ユーザー(またはプログラムロジック)が指定する必要があります何かを持っていないAPIを使用してAFHTTPClientを使うべきなのでしょうか?ユーザーデフォルトを使用した例は良いものですが、上記のコードは機能しますが、ユーザーは変更を有効にするためにアプリケーションを終了して再起動する必要があります。 – caiman
良い質問です!私も同様の問題があります。私は、プライマリサーバがダウンしているときにサーバをセカンダリサーバに切り替える必要があります。そして、スイッチが再びオンになって再び実行されたときにプライマリに戻ってきます。 –