上周五在根据网络服务获取数据的时候,本来上午可以请求回来的数据突然就下午就解析不到数据了。今天早上的时候我想还是把这个问题记下来。
#问题发生的精确位置
通过
xcode
断点在渲染html页面之前,这时候发现当程序走到断点的位置时程序已经在控制台打印堆栈了。这么一看就是说问题发生在子线程
中了,并且也有输出问题的原因Unable to convert data to string around character 79
。但是即使有输出原因我也不能立马定位它发生的位置。好在整个SDK除了网络请求的回调是系统又开的线程,其他就一个子线程处理任务(其实如果我事先能给SDK处理任务的线程定义个名字的话就会很快定位问题发生的位置
),通过断点终于定位出原来在解析数据的时候问题就发生了,也就是在下面的回调方法中:
1
2
3
4
5
6 httpManage.requestComplication=^(NSData * data,NSURLResponse * urlresponse,NSError * error)
{
//出错的精确位置
NSDictionary *jsonDic = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableContainers error:&error2];
}
#问题产生的原因
找到出错的位置后我想这个方法是系统提供的给我们处理json的怎么会解析失败了呢,原来怎么可以解析呢(
只能说自己太菜了
)?
#问题解决过程
根据控制台的信息提示找到原来是在处理中文的时候转换不成功。问了下后台的同志,他们在处理中文的时候是通过gbk编码过的。这才知道是编码解码的问题。下面是转码的方法:1
2
3
4//转换成gbk
NSStringEncoding gbkEncoding = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000);
//
NSString *result =[[ NSString alloc] initWithData:data encoding:gbkEncoding];
#回顾:
发生这次问题可以看到自己编码方式有待提高,一个通过控制台信息就可以定位的问题我却解决了好长时间。
#遗留问题
编码方法中
CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000);
传入的参数为什么不能是kCFStringEncodingGB_2312_80
,这两个参数有什么区别联系。现在只知道kCFStringEncodingGB_18030_2000
是kCFStringEncodingGB_2312_80
的扩展。