私は彼らの例で提案されたシングルトンモデルでAFNetworkingを使用しています。
+ (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を変更する必要があるもう1つの同様のケースは、適切なbaseURLを決定するために複数の呼び出しとロジックを必要とするAPIです。また、アプリの実行中にベースURLを変更することもできます(たとえば、ユーザーがネットワーク環境を変更し、ローカル接続から外部プロキシサーバー経由の3G接続に変更する必要があります)。
baseURLプロパティが読み取り専用である理由がわかります。バックグラウンドで実行され、その設定に関連付けられているnetworkReachabilityStatusなどがあります。とはいえ、監視を停止し、値を変更してから監視を再開するsetBaseURLメソッドを使用するのはかなり簡単なようです...
私のデザインは正しくないと思います。この場合、シングルトンをあきらめて、baseURLが変更されるたびにクライアントを再作成する必要がありますか?