Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.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 我们是否应该为所有差异可下载文件创建差异唯一会话标识符-swift_Ios_Swift_Nsurlsession_Nsurlsessionconfiguration - Fatal编程技术网

Ios 我们是否应该为所有差异可下载文件创建差异唯一会话标识符-swift

Ios 我们是否应该为所有差异可下载文件创建差异唯一会话标识符-swift,ios,swift,nsurlsession,nsurlsessionconfiguration,Ios,Swift,Nsurlsession,Nsurlsessionconfiguration,我是IOS编程新手。我想创建一个示例应用程序,允许用户从我的服务器下载许多文件。例如,我有10个文件,那么我应该调用方法let configuration=URLSessionConfiguration.background(带标识符:“firstTask”)10次,但不同的标识符像第一个文件带标识符:“firstTask”,第二个文件应该是带标识符:“secondTask”?。原因是我希望用户能够下载相同的文件名,然后我只需使用其他名称修改with identifier:“”。是这样吗?请给我

我是IOS编程新手。我想创建一个示例应用程序,允许用户从我的服务器下载许多文件。例如,我有10个文件,那么我应该调用方法
let configuration=URLSessionConfiguration.background(带标识符:“firstTask”)
10次,但不同的标识符像第一个文件
带标识符:“firstTask”
,第二个文件应该是
带标识符:“secondTask”
?。原因是我希望用户能够下载相同的文件名,然后我只需使用其他名称修改
with identifier:“
”。是这样吗?请给我一些建议

其他问题:

如何使具有特定标识符的会话无效?

根据:

标识符 配置对象的唯一标识符。此参数不能为nil或空字符串

还有一项声明:

如果iOS应用程序被系统终止并重新启动,则该应用程序可以使用相同的标识符创建新的配置对象和会话,并检索终止时正在进行的传输状态。此行为仅适用于系统正常终止应用程序。如果用户从多任务屏幕终止应用程序,系统将取消会话的所有后台传输。此外,系统不会自动重新启动用户强制退出的应用程序。用户必须明确重新启动应用程序,然后才能再次开始传输

:

使用URLSession的类方法background(withIdentifier:)创建背景URLSessionConfiguration对象,提供应用程序中唯一的会话标识符。因为大多数应用程序只需要几个后台会话(通常一个),所以您可以使用固定字符串作为标识符,而不是动态生成的标识符。标识符不需要全局唯一

因此,为您的应用程序使用一个唯一的
标识符是合理的。
例如,它可能包含整个应用程序的bundle id,如
com.awesomeapps.appname.sessionId

建议您“使用少量后台会话,最好只使用一个会话,并使用这些会话一次启动多个下载任务。”

但是,如果在应用程序挂起时需要下载完成的详细通知,则需要多个会话。与会话相关的所有后台传输完成后,系统将恢复应用程序,并通过
uiapplicationelegate
方法
应用程序(uU2;:handleEventsForBackgroundURLSession:completionHandler:)将会话标识符发送回应用程序。


会话标识符不需要全局唯一。如果您只有一个会话,那么选择什么并不重要。

我明白您的观点,我的应用程序的
标识符应该是唯一的。例如,如果我的第一个任务是名为
mySession
的标识符,并且它已下载完成。如果我下载了另一个文件,那么我应该使用相同的
标识符
对吗?下载完成后是否应使会话无效?然后,当我要下载另一个文件时,将创建新的会话。@VisalSambo如果要下载下一个文件,则应使用相同的id。通常不需要手动使会话无效。若你们并没有使它失效,那个么当应用程序终止时它就会失效。如果需要取消下载任务,则可以使用
invalidateAndCancel
(取消未完成的任务)或
finishtasks和invalidate
(允许未完成的任务在使对象无效之前完成)。要在会话对象失效后使用它,您必须使用上面讨论的相同id重新创建会话。感谢您的解释。现在我有了一些想法。但我还有一个疑问。现在,我的应用程序返回错误,该错误表示标识符为mySession的
URLSession已经存在。对于应用程序的流程,当用户单击按钮下载时,然后在包含下载文件列表的其他
viewController
中单击
viewDidload()
。该方法具有创建会话的功能。也许它在点击按钮时调用了很多次,所以它返回我一个错误,即id已经存在@VisalSambo之所以会发生这种情况,是因为您不必重新创建会话,只需创建一个会话并保持它直到应用程序处于活动状态。请尝试取消下载任务,您不必使会话无效,只需取消下载即可。很抱歉我上面的解释,似乎我没有使用正确的词语:)如果我们想更改会话的
allowscellardownloads
属性,则需要取消会话。要恢复数据下载,我们需要取消下载任务并获取恢复数据,然后删除原始会话,然后创建新会话,然后使用恢复数据创建新任务。这里的问题是,在创建新会话时是否可以使用原始会话标识符;目前,我收到与@VisalSambo相同的错误,“标识符为xxx的URLSession已经存在!”。