- 1.很多初学者,在每处用到网络请求的地方会直接�拿afn实例去请求�,从而带来了后续难以维护代码的问题
[[AFHTTPSessionManager manager] POST:nil parameters:nil success:^(NSURLSessionDataTask *task, id responseObject) {
} failure:^(NSURLSessionDataTask *task, NSError *error) {
}];
思考:如果afn不更新了,后续出现重大�bug适配问题,从而导致每处�用到afn的地方都要修改,请问怎么办?
答案:呵呵,只能一个个修改了!有人会说,怎么可能不更新,很多人用着呢,怕什么。那假设其他第三方也同样出现类型的问题呢?所以是不是应该有方法或某种思想去解决呢?
解决方法:写个网络基类HRHttpBase
,提供两个方法:GET 与 POST,外面请求时,直接调用这两个方法,万一afn出了问题,只要修改这两个方法即可,从而减轻后续维护成本!这种做法�同样适用于其他的第三方库, 这也是一种开发思想。
HRHttpBase.h
HRHttpBase.m
假设业务复杂的话,如登录,涉及到第三方登录之类的,有比较多的网络请求,可以专门抽一个网络请求类要处理:
HRhttpLogin.h
HRhttpLogin.m
- 2.�用到CocoaPods,但更改了afn代码问题
这是缺少text/html解析格式,请求网络时,只要添加上就行了,很多人在网上找到设置的地方(如下图)。但他忘了,项目用CocoaPods
管理第三方库的,如果项目上线之前,同事更新了CocoaPods
那么之前写的代码就没了!
解决办法:通过AFHTTPSessionManager实例找到AFHTTPResponseSerializer 对象,然后看有没提供对应的方法或属性可设置该格式。
像类似的网络请求header
和user-agent
都应该在自己的代码里设置!
- 3.返回字符串而并非是json或xml格式,怎么解析?
开发中确实是存在�奇葩的需求,还有可能返回一堆html
格式的String
,要截取Sting
里的某个key
。对于处理不了的格式,afn
有可能error
回调。
用AFHTTPSessionManager,我没找到未解析的字符(知道的朋友可以告诉我,谢谢)。最后还是用了AFHTTPRequestOperationManager
operation.responseString
即为未格式化的字符
ps:如果朋友们还有些奇怪的问题,可以回复我,一起解决!
文章同步到微信公众号:hans_iOS
有疑问可以在公众号里询问!
网友评论
}
7b226461 7461223a 7b226964 223a2238 61656633 38383235 32383233 34346130 31353530 37353365 61333435 66363922 2c226e61 6d65223a 22544a5f 46575f5a 5943222c 226f7267 4e616d65 223a22b9 facdf8cc ecbdf2b5 e7b6afc6 fbb3b5b7 fecef1b9 abcbbe22 2c22746f 74616c55 6e69636f 6465223a 22313231 30313132 34323622 2c22756e 69636f64 65223a22 31323432 36222c22 75736572 4e616d65 223a22d5 d4d3adb4 ba227d2c 226d6573 73616765 223a22b3 c9b9a622 2c227265 73756c74 223a2231 227d0d0a
请求头设置如下:
manager.requestSerializer = [AFHTTPRequestSerializer serializer];
manager.responseSerializer = [AFHTTPResponseSerializer serializer];
请问有遇到过吗 ? 请大神指点一下,还有你说的那个解析的格式所有的都加上了也还是不行
请求的连接是这个:https://api.apengdai.com/api/v2/activity/newlist?checkToken=035a4c4895adaccfdec1677e9304aa04&device_id=9b7b2120b6f72bf2022443ace5b396130882e005&stampToken=1468576204000
1.到沙盒看看有没数据
2.确定是否json格式是否正确(可以弄个简单的json数据测试)
3.打印下error,看输出什么信息
NSError *error;
NSDictionary *schDic = [NSJSONSerialization JSONObjectWithData:schoolData options:NSJSONReadingAllowFragments error:&error];
NSLog(@"%@", error);
// 存
NSArray *paths=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *path=[paths objectAtIndex:0];
NSString *Json_path=[path stringByAppendingPathComponent:@"JsonSchool.json"];
[dictData writeToFile:Json_path atomically:YES];
// 取
NSArray *paths=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *path=[paths objectAtIndex:0];
NSString *Json_path=[path stringByAppendingPathComponent:@"JsonSchool.json"];
//NSString *schoolPath = [[NSBundle mainBundle] pathForResource:@"sch" ofType:@"json"];
NSData *schoolData = [NSData dataWithContentsOfFile:Json_path];
NSDictionary *schDic = [NSJSONSerialization JSONObjectWithData:schoolData options:NSJSONReadingAllowFragments error:nil];
存进去了,但是取不出来。为什么。
anf用了两个网络请求库NSURLConnection、NSURLSession
1.NSURLConnection用的是delegate 异步
2.NSURLSession 异步
你不如直接用NSURLConnection的同步方法:-[NSURLConnection sendSynchronousRequest:returningResponse:error].
不过在多线程请求下利用信号量dispatch_semaphore可以这么玩:
dispatch_async(dispatch_get_global_queue(0, 0), ^{
dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
NSLog(@"1111111111");
[[AFHTTPSessionManager manager] GET:@"http://www.weather.com.cn/data/sk/101010100.html" parameters:nil success:^(NSURLSessionDataTask *task, id responseObject) {
NSLog(@"2222222222");
dispatch_semaphore_signal(semaphore);
} failure:^(NSURLSessionDataTask *task, NSError *error) {
NSLog(@"2222222222");
dispatch_semaphore_signal(semaphore);
}];
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
NSLog(@"333333333");
});
打印:
2016-06-01 18:52:01.111 AFNetwork源码分析[2521:1149134] 1111111111
2016-06-01 18:52:01.509 AFNetwork源码分析[2521:1149111] 2222222222
2016-06-01 18:52:01.510 AFNetwork源码分析[2521:1149134] 333333333
请问要紧吗?