服务器提取后{J}或NSDATA不完整/截断

时间:2017-10-25 18:50:47

标签: ios objective-c 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获取方法和JSON序列化方法上的那些选项,我总是留空,过去没有问题,就拉动的内容而言,它是相同的。我也尝试了没有爱的请求和会议等。

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

编辑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。

2 个答案:

答案 0 :(得分:1)

看看你是否得到了不同的结果:

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

或者完全排除NSLog,可能在那里断点代码,右键单击调试区域的变量窗格中的json,然后选择打印描述&#34; json&#34; < / p>

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

答案 1 :(得分:1)

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

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

从这里采取:

NSLog on devices in iOS 10 / Xcode 8 seems to truncate? Why?

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

对于那些后来的人,我正在运行Xcode 9.0。