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 是否为零,而应该检查successYES 还是NO。像这样检查错误参数在某些情况下会得到不正确的结果。 是的,你是对的,但我这样做是为了检查是否有错误,因为没有调用“如果成功” 我的意思是,这是检查错误的错误方法,可能会导致您的代码错误地将成功视为失败。如果你这样做,你就错了,你的代码将无法可靠地工作。 是的,我理解,但我想说的是它的结果是 NO(即我没有写入文件),但不是因为我有错误(因为没有调用错误条件),这意味着问题在别的地方。我完全同意在现实生活中我必须测试“成功与否”,但在这种情况下,这只是为了表明尽管无法写入文件,但我没有错误。但我仍然不明白为什么成功返回 NO。或者我没明白你的意思。 【参考方案1】:

确保dataPdf 不是nil - 我自己犯了这个错误!

【讨论】:

以上是关于NSData writeToFile 返回 NO 没有任何错误的主要内容,如果未能解决你的问题,请参考以下文章

NSDATA writeToFile 无故崩溃

iOS - 来自 NSData 完成处理程序的 writeToFile

ios 调用writeToFile将图片保存到本地一直失败的解决方案

NSData - 写入临时文件/目录

writetofile 总是返回 false

writeToFile 没有写入文件