Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/111.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios NSURLSessionPloadTask是否会保存临时文件_Ios_Nsurlsession_Temp_Nsurlsessionuploadtask - Fatal编程技术网

Ios NSURLSessionPloadTask是否会保存临时文件

Ios NSURLSessionPloadTask是否会保存临时文件,ios,nsurlsession,temp,nsurlsessionuploadtask,Ios,Nsurlsession,Temp,Nsurlsessionuploadtask,我正在实现一个可恢复的上传协议,在iOS上后台上传,这意味着我必须对文件使用NSURLSessionUploadTask。因为它是一个可恢复的上传协议,所以需要根据服务器已经接收到的数据来截断文件,所以我需要将一个新的临时文件保存到磁盘,其中只有要上传的字节 如果我可以在tmp/或/Library/Caches/中创建该临时上载文件,我是否可以相信只要NSURLSession正在运行,它就会一直保留 编辑:当上传失败时,服务器将保存已收到的字节,并将其传送给客户端。然后客户端应该只发送文件的一部

我正在实现一个可恢复的上传协议,在iOS上后台上传,这意味着我必须对文件使用
NSURLSessionUploadTask
。因为它是一个可恢复的上传协议,所以需要根据服务器已经接收到的数据来截断文件,所以我需要将一个新的临时文件保存到磁盘,其中只有要上传的字节

如果我可以在
tmp/
/Library/Caches/
中创建该临时上载文件,我是否可以相信只要NSURLSession正在运行,它就会一直保留


编辑:当上传失败时,服务器将保存已收到的字节,并将其传送给客户端。然后客户端应该只发送文件的一部分,这就是为什么我需要创建一个较小的临时文件,不能在上传过程中删除它。

嗯?您提供整个文件,系统负责管理部分上载/下载,并在传输完成后通知您。在下载的情况下,t会在下载完成后给您一个临时文件,您必须将其保存到永久位置

你根本不应该乱搞部分文件

编辑: 除非通过沙箱,否则您无法访问
tmp
/Library/Caches/
。您可以通过调用访问缓存目录

[NSSearchPathForDirectoriesInDomains(
  NSCachesDirectory, 
  NSUserDomainMask, YES) lastObject];
我的理解是,缓存目录只有在重新启动时才会被清除,或者设备空间严重不足时才会被清除,但我似乎记得,文档在缓存目录何时被清除的问题上模糊不清


您最好将文件保存到documents目录,然后在处理完后将其删除。

嗯?您提供整个文件,系统负责管理部分上载/下载,并在传输完成后通知您。在下载的情况下,t会在下载完成后给您一个临时文件,您必须将其保存到永久位置

你根本不应该乱搞部分文件

编辑: 除非通过沙箱,否则您无法访问
tmp
/Library/Caches/
。您可以通过调用访问缓存目录

[NSSearchPathForDirectoriesInDomains(
  NSCachesDirectory, 
  NSUserDomainMask, YES) lastObject];
我的理解是,缓存目录只有在重新启动时才会被清除,或者设备空间严重不足时才会被清除,但我似乎记得,文档在缓存目录何时被清除的问题上模糊不清


您最好将文件保存到documents目录,然后在完成后将其删除。

您的问题的答案是否定的。NSURLSessionUploadTask的描述似乎支持保留源文件,但这有误导性:

在iOS中,当您在后台会话中为文件创建上载任务时,系统会将该文件复制到一个临时位置并从那里传输数据

但它没有说明是否将原始源文件保留在tmp目录中。特别适用于您的服务器支持上载部分文件,并且在出现故障后需要重新启动这些文件的情况。或者在更常见的情况下,您需要手动重新启动整个失败的上载,例如,由于可重试的服务器错误,或者如果用户杀死了您的应用,然后重新启动它(iOS不会继续上载用户杀死的应用)

在这些情况下,如果您在apps tmp目录中创建文件,则无法指望该文件仍然存在。《文件系统编程指南》告诉我们这一点

“使用此目录可写入不需要在应用程序启动之间保留的临时文件。当不再需要文件时,应用程序应从该目录中删除这些文件;但是,当应用程序未运行时,系统可能会清除此目录。iTunes或iCloud不会备份此目录的内容。”


所以当你的应用程序停止运行时,任何tmp目录文件都可以被iOS删除,我可以确认我在我们的应用程序的生产版本中看到过这一点。如果您认为可能需要再次上传源文件,则必须将其存储在自己的应用程序目录中,并在完成后自行删除。抱歉,需要额外的工作,但我不知道如何解决此问题。

您的问题的答案是否定的。NSURLSessionPloadTask的描述似乎支持保留源文件,但这会产生误导:

在iOS中,当您在后台会话中为文件创建上载任务时,系统会将该文件复制到一个临时位置并从那里传输数据

但它没有说明是否将原始源文件保留在tmp目录中。特别适用于您的服务器支持上载部分文件,并且在出现故障后需要重新启动这些文件的情况。或者在更常见的情况下,您需要手动重新启动整个失败的上载,例如,由于可重试的服务器错误,或者如果用户杀死了您的应用,然后重新启动它(iOS不会继续上载用户杀死的应用)

在这些情况下,如果您在apps tmp目录中创建文件,则无法指望该文件仍然存在。《文件系统编程指南》告诉我们这一点

“使用此目录可写入不需要在应用程序启动之间保留的临时文件。当不再需要文件时,应用程序应从该目录中删除这些文件;但是,当应用程序未运行时,系统可能会清除此目录。iTunes或iCloud不会备份此目录的内容。”

所以当你的应用程序停止运行时,任何tmp目录文件都可以被iOS删除,我可以确认我在我们的应用程序的生产版本中看到过这一点。如果您认为可能需要再次上传源文件,则必须将其存储在自己的应用程序目录中,并在完成后自行删除。对不起,额外的工作,但我不知道