didReceiveData获取数据,概率性出现解析出错
2013-09-30 12:01
218 查看
最近遇到被一个问题折腾惨了,后来终于解决,这里记录一下。
问题现象:
JSON解析失败,报错如下:
可又不是每次都失败,有些时候又会成功。
刚开始怀疑所JSON的格式错了,但为什么有时候会成功呢?
于是怀疑所有些数据里面可能保护\n,\r等字符,影响了解析。可是加入了转义甚至替换之后,该问题还是没解决,陷入了困境。
难道所因为数据被截断了?
没办法,只能打日志进行调试,发现:
发现data的内容有时候为8520,有时候又是4536和3984。
果然,数据真的被截断,被分成了两部分返回。
于是开始找答案,发现当异步请求返回数据过大时,didiReceiveData这个代理函数所会调用多次的,应该使用connectionDidFinishLoading函数,把数据接收完全后进行处理。
解决代码如下:
1、在.h文件里面加入变量来接收数据
2、在didiReceiveData这个委托方法里面获取接收的数据进行存储
3、加入connectionDidFinishLoading函数,在这个函数中完成数据解析
总结:
对于非常少量的数据,可以在didiReceiveData里面写接收数据后的处理逻辑,对于请求大量数据的场景,切记,一定要在connectionDidFinishLoading中,对接收完全的数据进行处理。
问题现象:
JSON解析失败,报错如下:
可又不是每次都失败,有些时候又会成功。
刚开始怀疑所JSON的格式错了,但为什么有时候会成功呢?
于是怀疑所有些数据里面可能保护\n,\r等字符,影响了解析。可是加入了转义甚至替换之后,该问题还是没解决,陷入了困境。
难道所因为数据被截断了?
没办法,只能打日志进行调试,发现:
//实现获取到数据的委托方法 -(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { NSLog(@"length: %d", [data length]); }
发现data的内容有时候为8520,有时候又是4536和3984。
果然,数据真的被截断,被分成了两部分返回。
于是开始找答案,发现当异步请求返回数据过大时,didiReceiveData这个代理函数所会调用多次的,应该使用connectionDidFinishLoading函数,把数据接收完全后进行处理。
解决代码如下:
1、在.h文件里面加入变量来接收数据
@property(strong, nonatomic) NSMutableData *recvData;
2、在didiReceiveData这个委托方法里面获取接收的数据进行存储
//实现获取到数据的委托方法 -(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { NSLog(@"length: %d", [data length]); [self.recvData appendData:data]; }
3、加入connectionDidFinishLoading函数,在这个函数中完成数据解析
//获取到全部数据后,进行数据解析 -(void)connectionDidFinishLoading:(NSURLConnection *)connection { NSError *error; NSDictionary *json = [NSJSONSerialization JSONObjectWithData:self.recvData options:NSJSONReadingMutableLeaves error:&error]; if (json == nil) { [self doneLoadingTableViewData]; NSLog(@"json parse failed. \n error is: %@", error); return; } NSString *result = [json objectForKey:@"result"]; if ([result boolValue]) { //to do } }
总结:
对于非常少量的数据,可以在didiReceiveData里面写接收数据后的处理逻辑,对于请求大量数据的场景,切记,一定要在connectionDidFinishLoading中,对接收完全的数据进行处理。
相关文章推荐
- Data获取字节数据,组成字符串出错 rapidjson解析出错
- PHP 出现解析json数据出错的问题
- 解决:在使用JSONP跨域请求时.AJAX的dataFilter获取返回数据出现undifined
- httpResponse的getEntity为空,获取了这个数据在解析的时候出现了String不能转换成json对象
- ASIHTTP请求的数据解析出错问题Error Domain=NSCocoaErrorDomain Code=3840 "Unable to convert data to string around
- Salesforce的数据模型Data Modules(全面解析)
- Android中数据文件解析(Json解析【从服务器端获取数据并且解析,显示在客户端上面】)
- Vue.js--基于$.ajax获取数据并与组件的data绑定
- 通过HttpClient获取服务器接口json数据已及解析
- multipart/form-data post 方法提交表单,后台获取不到数据
- <WP7>(三)手把手教你写天气预报程序:运用WebClient获取天气和json数据解析
- .NET解析xml字符串,通过反射给实体类对象赋值,获取实体类数据列表
- 根据经纬度查询地址并对获取的json数据进行解析
- CGI原理解析系列之中的一个----CGI怎样获取WEBserver数据
- Android中数据文件解析(Json解析【从服务器端获取数据并且解析,显示在客户端上面】)
- android客户端从服务器端获取json数据并解析的实现代码
- 总结Asp.net中Page加载PostData的具体过程 进而解决"获取动态创建的控件的PostData数据"问题
- Java从网络中请求获取JSon数据以及解析JSON数据----(自创,请注明)
- javascript eval函数解析json数据时为什加上圆括号eval("("+data+")")
- 解析DataWorks数据集成中测试连通性失败问题