之前项目中有个需求:中英文的切换。和常见的App上本地文字的国际化(先附上App国际化的一篇文章:http://www.jianshu.com/p/ef953d537c2d)有所不同,该项目要求在中英文进行切换的时候请求的数据也要进行中英文的切换,于是就要在中英文进行切换的时候对请求的网络地址的域名进行切换。
项目之前的做法是将域名定义为一个宏,然后封装的网络请求类中把域名拼接在请求的网络地址中。现在根据项目的需求我的做法是新建一个切换域名的类,该类是一个单例,将域名作为该单例类的一个属性,然后在切换中英文的时候改变域名这个属性的值。最后在网络请求类中把域名这个属性值拼接在请求的网络地址中。
切换域名单例的代码:
#import "ChangeURLObject.h"
static ChangeURLObject * changeURLObject;
@implementation ChangeURLObject
+ (ChangeURLObject *)sharedChangeURLObject{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
changeURLObject = [[super allocWithZone:NULL] init];
[changeURLObject changeLanguage];
});
return changeURLObject;
}
- (instancetype)init{
if (self = [super init]) {
//注册通知,用于接收改变语言的通知
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(changeLanguage) name:ChangeLanguageNotificationName object:nil];
}
return self;
}
- (void)changeLanguage{
NSString * str = kLocalizedString(@"baseURL", @"域名");
_baseURL = str;
}
- (void)dealloc{
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
@end
封装的网络请求类中拼接域名的代码:
+ (void)GET:(NSString *)URLString parameters:(id)parameters success:(void (^)(id))success failure:(void (^)(NSError *))failure{
ChangeURLObject * changeObject = [ChangeURLObject sharedChangeURLObject];
NSLog(@"===baseURL:%@", changeObject.baseURL);
NSString * baseURL = changeObject.baseURL;
AFHTTPSessionManager * manager = [AFHTTPSessionManager manager];
manager.requestSerializer.timeoutInterval = 30; // 设置请求超时时间
manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"text/html",@"text/plain",@"application/json", nil];
if (![URLString hasPrefix:@"http"]) {
URLString = [NSString stringWithFormat:@"%@%@", baseURL, URLString];
}
[manager GET:URLString parameters:parameters progress:^(NSProgress * _Nonnull downloadProgress) {
} success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
if (success) {
success(responseObject);
}
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
if (failure) {
NSString * str = kLocalizedString(@"Network Error", @"网络错误");
[SVProgressHUD showErrorWithStatus:str];
failure(error);
}
}];
}
如果在这里看代码觉得有点长看的有点迷糊的话,可以将代码拷贝拷贝到新建的一个项目中,在Xcode中看代码就会感觉清晰些了。
本篇文章到这里就结束了,愿大家加班不多工资多,男同胞都有女朋友,女同胞都有男朋友。😊