服务器拉取后JSON或NSDATA不完整/被截断



我正在从服务器中提取一个.json文件,并试图将其读取到应用程序中的NSDictionary中。部分文件被正确解析,但不完整——只读取了部分文件。

奇怪的是,NSData的长度与实际文件的长度相等,因此它似乎具有完全访问权限,至少在某个阶段是这样。然而,当我记录NSData时,对于文件的大小来说,它似乎太短了。

以下是我用来查找错误的代码:

//SYNC BOOL
if (isSyncing){ return; }
isSyncing = true;
//FETCH BOOTSTRAP
NSError * fetchError = nil;
NSData * data = [NSData dataWithContentsOfURL:[NSURL URLWithString:syncPath]
options:kNilOptions
error:&fetchError];
if (fetchError){   [self error]; return; }
//PARSE JSON
NSError * jsonError = nil;
NSDictionary * json = [NSJSONSerialization JSONObjectWithData:data
options:kNilOptions
error:&jsonError];
if (jsonError){ [self error]; return; }

NSLog(@"data length is %lu", data.length);
NSLog(@"json is %@", json);

我尝试过从服务器远程加载,也尝试过从NSBundle本地加载,结果相同。

这可能与编码/JSON中的流氓字符/某些NSData最大长度有关吗?

NSData fetch方法和JSON Serialization方法上的这些选项,我过去总是留空,没有任何问题,就提取的内容而言,都是一样的。我也尝试过没有爱的请求和会话等。

编辑:我应该补充一点,当我记录json字典的.allKeys时,它会正确返回所有键(包括字典本身日志中未包含的键)。这与正确的NSData长度相结合,意味着数据实际上是完整的。一种解释是,NSLog本身是否以某种方式被截断,这意味着在不存在NSLog的情况下会出现错误。问题是我在那里什么都没改。这可能是新Xcode中的测试版错误。

编辑B:Xcode 9上的记录器错误?

NSString * string = @"";
for (int n = 0; n < 10000; n++){
string = [NSString stringWithFormat:@"%@ %i",string,n];
}
NSLog(@"string is %@", string);

输出为6.7k而不是10k。

查看是否使用获得不同的结果

NSLog(@"json is %@", json.description);

或者,为了完全排除NSLog,可以在那里中断代码,右键单击调试区域的变量窗格中的json,然后选择打印"json"的描述

我的经验是,NSJSONSerialization将为格式错误的JSON返回错误。

这似乎是Xcode本身的一些愚蠢功能。此定义适用于完整的NSLog:

#define NSLog(FORMAT, ...) printf("%sn", [[NSString stringWithFormat:FORMAT, ##__VA_ARGS__] UTF8String]);

取自此处:

NSLog在iOS 10/Xcode 8中的设备上似乎截断了?为什么?

有多少开发人员会花时间在懒惰的记录器中寻找想象中的错误。。。

对于以后的用户,我将运行Xcode 9.0。

最新更新