目前,我想实现的是从一个数组下载文件,一次只下载一个文件,即使应用程序进入后台状态,它仍然执行下载。
正如这里所述,我使用的是Rob代码,但他使用的是urlsessionconfiguration.default,我希望使用urlsessionconfiguration.background(withidentifier:“uniqueid”)。
它在第一次尝试中确实有效,但在它进入后台后,一切都变得混乱。操作开始一次下载多个文件,并且不再按顺序下载。
有什么解决办法,或者我应该用什么来实现我想要的。如果在Android系统中,我们有服务可以轻松处理。
在运行中包装请求的整个想法只有在应用程序处于活动/运行状态时才适用。对于限制前台请求的并发度、管理依赖关系等方面都非常有用。
然而,对于应用程序暂停后继续进行的背景会话,这些都不相关。创建请求,将其交给后台会话管理,并监视为后台会话调用的委托方法。不需要/不需要任何操作。请记住,这些请求将由后台会话守护进程处理,即使您的应用程序被挂起(或者如果它在正常的生命周期中被终止,但如果您强制退出它,则不会)。因此,如果后台urlsession
守护进程正在处理请求,而您的应用程序没有活动,那么操作、操作队列等的整个思想就没有意义了。
背景会话的例子见https://stackoverflow.com/a/44140059/1271826。
由于这种复杂性,您可能需要考虑是否绝对需要这样做。有时,如果您只需要不到30秒的时间就可以完成一些请求,那么在用户离开应用程序后,要求操作系统让应用程序在后台运行一小段时间,并使用标准的URLSession
就更容易了。有关更多信息,请参见延长应用程序的后台执行时间。这是一个简单得多的解决方案,绕过了许多后台urlsession
的麻烦。但它只有在你只需要30秒或更少的时候才起作用。对于可能超过此小窗口的较大请求,需要真正的后台URLSession
。
下面,你问:
据我所知,[并行下载多个文件]有一些缺点。
但是对于后台会话,请求不会因为后台守护进程还没有到达而超时。只需将请求添加到后台urlsession
,并让OS为您处理。您肯定不想一次下载一个图像,当一次下载完成时,后台守护程序在后台重新启动您的应用程序,以便您可以启动下一次下载。这将是非常低效的(无论是在用户的电池和速度方面)。
您需要在文件数组中循环,然后添加到会话中以使其下载,但它将是异步下载的,因此很难跟踪,因为文件很多。
当然,如果请求是并行运行的,则不能进行简单的“添加到数组末尾”,因为不能保证它们将完成的顺序。但是当他们进来的时候,捕捉这些反应并不难。例如,只需使用字典,可能是由原始请求的URL键控的。然后,您可以轻松地在该字典中查找与特定请求URL相关联的响应。
简单得令人难以置信。我们现在可以并行地执行请求,这样速度更快、效率更高。
你接着说:
[并行下载]可能会导致电池的高消耗,同时有大量的请求。这就是为什么我试图让它一次下载一个文件。
不管怎样(尤其是在支持较旧的iOS版本的情况下),您可能还需要考虑适当的设置isdefinition
和allowsCellularAccess
。
归根结底,您要确保您尊重用户有限的蜂窝数据计划,或者他们是否在使用一些昂贵的服务(例如,在飞机上连接昂贵的数据计划,或者通过某个本地热点连接)。
有关这些注意事项的更多信息,请参见WWDC 2019网络进展,第1部分。
问题内容: 我目前有2个命令按钮和一个列表框。根据列表框的选择,生成的结果可以显示在可下载的文件中或呈现为HTML表。该代码基于BalusC的PDF Handling教程 ,而set 。 到目前为止,两个按钮都可以正常工作。但是,我想将两个动作组合为一个按钮。当我用一个可以触发两个动作的按钮进行测试时,什么也没发生(没有文件另存为对话框或表)。这是因为一个动作是ajax还是另一个动作以ajax结尾
我正在创建一个应用程序,其中我从服务器下载一些数据。在后台运行时,我希望连接应该继续运行,以便可以下载数据。我知道在app里有方法 当应用程序进入后台时调用。但由于连接是在viewController中创建的,如何在appDelegate中管理它 还有其他方法可以做到这一点吗?我已经通过了这个链接,但是有一个简单的实现方法吗?
我做我的代码在CromeDrive在'正常'模式和工作正常。当我切换到无头模式时,它不会下载文件。我已经尝试了我在互联网上找到的代码,但是不起作用。 有人知道如何解决这个问题吗? PS:我不一定要用Chomedrive。如果它在另一个驱动器中工作,对我来说没问题。
我是批处理脚本的新手,遇到了一个问题。我在FTP服务器上的文件夹中有一些文件。文件名如下所示。 我只想下载那些文件名中同时包含20160302和NORMAL的文件。 我已经尝试了两个字符串,例如 这将下载包含20160302或正常的文件。 有什么想法吗? 提前感谢。
我正在使用后台服务,以获得用户的位置和上传到服务器。 我使用了一个扩展Service类的LocationTrack类和扩展BroadcastReciver的AlramReciver。 我已经在manifest中添加了所有权限,并在manifest文件中注册了AlarmReciver和LocationTracker类。 Oreo-在前台启动服务 https://developer.android.c
我们有一个客户机-服务器架构,使用Google Drive在客户机和服务器之间共享文件,而不需要实际发送它们。 客户机使用Google Drive API获取它希望与服务器共享的所有文件的文件ID列表。 服务器然后使用适当的授权令牌下载文件。 服务器响应时间对用户体验至关重要。