gpt4 book ai didi

ios - NSURLSession后台传输: Callback for each video downloaded from a queue

转载 作者:塔克拉玛干 更新时间:2023-11-02 10:30:59 26 4
gpt4 key购买 nike

我正在使用后台传输服务通过 NSURLSession 下载多个视频。当应用程序处于后台模式时,下载工作正常,我对此感到满意。我的问题是,我想为从队列中下载的每个视频回调。

我期望为每个下载的视频调用以下方法:

-(void)application:(UIApplication *)application handleEventsForBackgroundURLSession:(NSString *)identifier
completionHandler:(void (^)())completionHandler

当系统在后台传输后没有更多消息发送到我们的应用程序时,以下方法:

-(void)URLSessionDidFinishEventsForBackgroundURLSession:(NSURLSession *)session

但是,当所有下载完成时,这两种方法都会被调用。我放了 3 个视频供下载,然后将 App 置于后台。下载完所有 3 个视频后调用这两种方法。


这是我在这些方法中所做的:

AppDelegate

-(void)application:(UIApplication *)application handleEventsForBackgroundURLSession:(NSString *)identifier 
completionHandler:(void (^)())completionHandler
{
self.backgroundTransferCompletionHandler = completionHandler;
}

下载ViewController

- (void)URLSessionDidFinishEventsForBackgroundURLSession:(NSURLSession *)session
{
AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];

if (appDelegate.backgroundTransferCompletionHandler)
{
void (^completionHandler)() = appDelegate.backgroundTransferCompletionHandler;
appDelegate.backgroundTransferCompletionHandler = nil;
completionHandler();
}

NSLog(@"All tasks are finished");
}

是否可以在下载每个视频时向用户显示本地通知?或者,我必须等到所有视频在后台完成下载?

如果答案是NO,那么我的问题是这两个不同回调的目的是什么?是什么将它们彼此分开?

最佳答案

Is it possible to show user a local notification on downloading of each video ? Or, I will have to wait til all videos complete downloading in the background ?

当与该 session 关联的所有下载都完成时,应用程序将仅在后台使用 handleEventsForBackgroundURLSession 重新启动,而不是一个接一个。后台 session 的想法是尽量减少在后台运行(或重复启动然后暂停)的电池消耗,而是让后台守护进程为您做这些,并在一切完成时通知您。

理论上,您可以为每个实例化一个单独的后台 session ,但我认为这是对后台 session 的滥用(其目的是减少启动您的应用程序并在后台运行它所花费的时间)如果 Apple 反对这种做法,我也不会感到惊讶。它还需要一个笨拙的实现(具有多个 NSURLSession 对象)。

If the answer is NO, then my question is what is the purpose of these two different callbacks ? What separates them from each other ?

单独回调的目的是,一旦您的应用再次运行,它就可以为每次下载执行任何需要的后期处理(例如,将文件从临时位置移动到最终位置)。每次下载都需要单独的回调,即使当应用程序在后台模式下重新启动时它们会被快速连续调用。此外,如果该应用恰好已经在前台运行,您可以在下载完成时处理这些下载。


顺便说一句,LombaX 是正确的,handleEventsForBackgroundURLSession 应该启动后台 session 。就个人而言,我将 completionHandler 作为 NSURLSession 对象的包装器的一个属性,因此 handleEventsForBackgroundURLSession 将实例化它(准备好调用它的委托(delegate)方法),并将 completionHandler 保存在那里。这是保存完成处理程序的合乎逻辑的地方,无论如何你必须实例化 NSURLSession 及其委托(delegate),并且它保存 URLSessionDidFinishEventsForBackgroundURLSession 需要返回到应用程序委托(delegate)获取保存的完成处理程序。

对不对,我的典型实现是把后台的NSURLSession对象做成单例。因此我最终得到了类似的东西:

- (void)application:(UIApplication *)application handleEventsForBackgroundURLSession:(NSString *)identifier completionHandler:(void (^)())completionHandler {    
[BackgroundSession sharedSession].savedCompletionHandler = completionHandler;
}

一石二鸟,启动后台NSURLSession,保存completionHandler

关于ios - NSURLSession后台传输: Callback for each video downloaded from a queue,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37386786/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com