2014-05-14 50 views
2

我正在使用AFNetworking。AFNetworking變更基地址

我想手動更改baseURL。

+ (CustomHTTPClient*)sharedClient{ 
static dispatch_once_t pred; 
static CustomHTTPClient *_sharedClient = nil; 



NSLog(@"ShareClient %@",_sharedClient); 
if (!_sharedClient) 
{ 
    _sharedClient = [[self alloc] initWithBaseURL:[NSURL URLWithString:[[NSUserDefaults standardUserDefaults]objectForKey:@"serverURL"]]]; 
    [AFNetworkActivityIndicatorManager sharedManager].enabled = YES; 
} 
else 
{ 

    NSLog(@"Delete ShareClient %@",_sharedClient); 
    _sharedClient = nil; 

    _sharedClient = [[self alloc] initWithBaseURL:[NSURL URLWithString:[[NSUserDefaults standardUserDefaults]objectForKey:@"serverURL"]]]; 
    NSLog(@"NEW ShareClient %@",_sharedClient); 
    [AFNetworkActivityIndicatorManager sharedManager].enabled = YES; 

} 


return _sharedClient; 
} 

選項2:

+ (CustomHTTPClient*)sharedClient{ 
static dispatch_once_t pred; 
static CustomHTTPClient *_sharedClient = nil; 


dispatch_once(&pred, ^{ 
    _sharedClient = [[self alloc] initWithBaseURL:[NSURL URLWithString:[[NSUserDefaults standardUserDefaults]objectForKey:@"serverURL"]]]; 
    [AFNetworkActivityIndicatorManager sharedManager].enabled = YES; 
}); 

return _sharedClient; 
} 

選項1:這將創建shareclient每次。所以它會一直使用正確的(新)BaseURL。 選項2:僅調用onces,所以BaseURL將始終保持相同。

定價:使用選項1而不是選項2的含義是什麼?

我也檢查了一些其他答案,但想了解(簡單地說)爲什麼要使用Dispatch_once以及如何讓dispatch_once被多次調用?

changing AFNetworking baseURL

回答

4

如果你之間切換基本URL的可能是更容易每次初始化一個新的經理,而不是使用一個共享的一個。使用共享管理器的許多好處是單個靜態基本URL。

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; 
[manager GET:@"http://example.com/resources.json" parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) { 
    NSLog(@"JSON: %@", responseObject); 
} failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
    NSLog(@"Error: %@", error); 
}]; 

調度點的一次是隻執行一次塊。

+0

謝謝馬克!它應該按照你描述的方式工作!但是,我必須檢查AFJSONRequestSerializer的子類中的其他代碼。 @interface CustomHTTPRequestSerializer:AFJSONRequestSerializer。再次感謝!現在我知道我應該檢查什麼了! – Nitya

3

您可以在您的類中添加getter方法並返回不同的baseURL。 例如

+ (CustomHTTPClient*)sharedClient 
{ 
    static dispatch_once_t pred; 
    static CustomHTTPClient *_sharedClient = nil; 

    dispatch_once(&pred, ^{ 
     _sharedClient = [[self alloc] initWithBaseURL:[NSURL URLWithString:[[NSUserDefaults standardUserDefaults]objectForKey:@"serverURL"]]]; 
     [AFNetworkActivityIndicatorManager sharedManager].enabled = YES; 
    }); 

    return _sharedClient; 
} 

- (NSURL *)baseURL 
{ 
    if (SOMETHING) { 
     return [[NSUserDefaults standardUserDefaults]objectForKey:@"serverURL"]]; 
    } else { 
     return [[NSUserDefaults standardUserDefaults]objectForKey:@"anotherServerURL"]]; 
    } 
}