更改AFNetworking baseURL

cai*_*man 16 objective-c afnetworking

我正在使用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;
}
Run Code Online (Sandbox Code Playgroud)

使用从用户默认值中获取的baseURL完成初始化.

我的问题是baseURL属性是只读的.如果用户进入设置并更改baseURL用户默认值,我该如何在客户端更改它?

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

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

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

Fel*_*lix 23

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

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

  • 在您的AFHTTPClient子类中重写属性限定符.把它放在@interface里面:@property (readwrite, nonatomic, retain) NSURL *baseURL;

  • 不要使用AFHTTPClient在所有

  • 创建多个实例 AFHTTPClient

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

  • 我发现@ phix23选项3最适合我.单身人士在很多时候往往比他们的价值更痛苦.只需在每次需要时创建AFHTTPClient的新实例,对我使用AFNetworking的应用程序最有意义.这种方式相当痛苦. (5认同)
  • 谢谢你的建议!只是覆盖并使属性读写是危险的,因为该类会跟踪baseURL引用的服务的可访问性.但是可以通过仔细取消订阅监控,然后重新激活来覆盖它.我最终离开了单例模型,并在我的主控制器中保存了AFHTTPClient子类对象.在我需要更改baseURL时,我可以使用新的新对象覆盖它.我同意你的选择2,3和4 ;-) (4认同)