NSData writeToFile 返回 NO 没有任何错误
Posted
技术标签:
【中文标题】NSData writeToFile 返回 NO 没有任何错误【英文标题】:NSData writeToFile returns NO without any error 【发布时间】:2017-09-26 13:47:02 【问题描述】:我知道许多主题已经存在,但似乎没有一个能启发我的问题。
我应该从服务器上的 JSON 请求中获取一个 PDF 文件。下载任务过程被调用,但是当我尝试将我的 NSData 存储到文件时,它没有成功但没有返回任何错误。
- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)location
NSData *dataPdf = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://..."]];
/// Get path directory
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
[[NSFileManager defaultManager] createDirectoryAtPath:documentsDirectory withIntermediateDirectories:YES attributes:nil error:nil];
NSString *filePath = [NSString stringWithFormat:@"%@/%@", documentsDirectory, @"msc.pdf"];
NSLog(@"filePath: %@", filePath); /Users/.../Devices/.../Documents/msc.pdf
NSError *error = nil;
BOOL success = [dataPdf writeToFile:filePath options:NSDataWritingAtomic error:&error];
if (error)
NSLog(@"Error:\n%@", error.localizedDescription); // -> Not called
else
NSLog(@"Success? %hhd", success); // -> Returns NO
同一段代码适用于其他 PDF 下载(但这个更复杂,因为它涉及服务器端的一些脚本,而不是直接链接)。
有人知道出了什么问题吗?
我不知道它是否能让事情更清楚,但我不知道我是否真的得到了我应该得到的 PDF 文件。我所知道的是至少有一些字节下载(NSURLSession didWriteData 返回 487)应该可以在设备上写入,因为 NSData 不为空/nil。
【问题讨论】:
不确定,但有一个细节:您不应该检查error
是否为零,而应该检查success
是YES
还是NO
。像这样检查错误参数在某些情况下会得到不正确的结果。
是的,你是对的,但我这样做是为了检查是否有错误,因为没有调用“如果成功”
我的意思是,这是检查错误的错误方法,可能会导致您的代码错误地将成功视为失败。如果你这样做,你就错了,你的代码将无法可靠地工作。
是的,我理解,但我想说的是它的结果是 NO(即我没有写入文件),但不是因为我有错误(因为没有调用错误条件),这意味着问题在别的地方。我完全同意在现实生活中我必须测试“成功与否”,但在这种情况下,这只是为了表明尽管无法写入文件,但我没有错误。但我仍然不明白为什么成功返回 NO。或者我没明白你的意思。
【参考方案1】:
确保dataPdf
不是nil
- 我自己犯了这个错误!
【讨论】:
以上是关于NSData writeToFile 返回 NO 没有任何错误的主要内容,如果未能解决你的问题,请参考以下文章
iOS - 来自 NSData 完成处理程序的 writeToFile