16

私は彼らの例で提案されたシングルトンモデルで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が変更されるたびにクライアントを再作成する必要がありますか?

4

2 に答える 2

23

このクラスAFHTTPClientは、単一のベース URL で動作するように設計されています。これが読み取り専用である理由です。

複数のベース URL がある場合の解決策を次に示します。

  • AFHTTPClientサブクラスでプロパティ修飾子をオーバーライドします。これを @interface 内に配置します。@property (readwrite, nonatomic, retain) NSURL *baseURL;

  • AFHTTPClient絶対に使わない

  • の複数のインスタンスを作成するAFHTTPClient

  • HTTP 操作を作成するときに、baseURL をオーバーライドできます。相対パスではなく、パスに完全な URL を設定するだけです。

于 2012-07-25T12:08:08.207 に答える