更改AFNetworking baseURL

时间:2012-07-24 21:20:28

标签: objective-c afnetworking

我正在使用AFNetworking和their example中建议的单身模型。

+ (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的另一个类似情况是一个API,它需要多个调用和逻辑来确定正确的baseURL。在应用程序运行时,基本URL仍然可以更改(例如,用户更改网络环境,需要通过外部代理服务器从本地连接更改为3G连接。)。

我知道为什么baseURL属性是只读的:有些像networkReachabilityStatus在后台运行并且与该设置相关联。这就是说,使用setBaseURL方法停止监控,更改值,然后再次开始监控似乎相当容易......

我想我的设计不对,在这种情况下我应该放弃单身,并在每次更改baseURL时重新创建客户端吗?

2 个答案:

答案 0 :(得分:22)

AFHTTPClient旨在使用单个基本URL。这就是为什么它是readonly。

如果您有多个基本网址,以下是一些解决方案:

    AFHTTPClient子类中的
  • 覆盖属性限定符。将其放在@interface中:@property (readwrite, nonatomic, retain) NSURL *baseURL;

  • 请勿使用AFHTTPClient

  • 创建AFHTTPClient

  • 的多个实例
  • 创建HTTP操作时,您可以覆盖baseURL。只需在路径中设置完整的URL,而不是相对路径。

答案 1 :(得分:0)

希望这会对你有所帮助。

http://purl.org/dc/terms/title