- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在使用后台传输服务通过 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/
我试图弄清楚以下模块正在做什么。 import Queue import multiprocessing import threading class BufferedReadQueue(Queue.
如果我使用 Queue.Queue,那么我的 read() 函数不起作用,为什么?但是,如果我使用 multiprocessing.Queue,它运行良好: from multiprocessing
我正在寻找比我在文档中找到的更多关于 Python 队列实现的见解。 根据我的理解,如果我在这方面有误,请原谅我的无知: queue.Queue():通过内存中的基本数组实现,因此不能在多个进程之间共
当我使用多处理模块(Windows 上的 Python 2.7)中的队列代替 Queue.Queue 时,我的程序没有完全关闭。 最终,我想使用 multiprocessing.Process 处理
阅读了大量的 JavaScript 事件循环教程,我看到了不同的术语来标识队列存储消息,当调用堆栈为空时,事件循环准备好获取消息: 队列 消息队列 事件队列 我找不到规范的术语来识别它。 甚至 MDN
我收到错误消息“类型队列不接受参数”。当我将更改队列行替换为 PriorityQueue 时,此错误消失并且编译正常。有什么区别以及如何将其更改为编译队列和常规队列? import java.util
如何将项目返回到 queue.Queue?如果任务失败,这在线程或多处理中很有用,这样任务就不会丢失。 docs for queue.Queue.get()说函数可以“从队列中删除并返回一个项目”,但
如何在多个 queue.Queue 上进行“选择”同时? Golang 有 desired feature及其 channel : select { case i1 = 声明。 线程:queue 模
http://docs.python.org/2/library/queue.html#Queue.Queue.put 这似乎是一个幼稚的问题,但我在文档和谷歌搜索中都没有找到答案,那么这些方法是线程
这可能是个愚蠢的问题,但我对与 .dequeue() 和 $.queue() 一起使用的 .queue() 感到困惑> 或 jquery.queue()。 它们是否相同,如果是,为什么 jquery
我正在尝试创建一个线程化的 tcp 流处理程序类线程和主线程对话,但是 Queue.Queue 也没有做我需要的,服务器从另一个程序接收数据,我只想传递它进入主线程进行处理这里是我到目前为止的代码:
The principal challenge of multi-threaded applications is coordinating threads that share data or ot
在Queue模块的queue类中,有几个方法,分别是qsize、empty 和 full,其文档声称它们“不可靠”。 他们到底有什么不可靠的地方? 我确实注意到 on the Python docs网
我需要一个队列,多个线程可以将内容放入其中,并且多个线程可以从中读取。 Python 至少有两个队列类,Queue.Queue 和 collections.deque,前者似乎在内部使用后者。两者都在
明天我将介绍我选择进程内消息队列实现的基本原理,但我无法阐明我的推理。我的合作设计者提议我们实现一个简单的异步队列,只使用基本的作业列表和互斥锁来控制访问,我建议在嵌入式模式下使用 ActiveMQ。
在 scala 中定义了一个特征: trait Queue[T] Queue 是一种类型吗?或其他东西,例如类型构造函数? 来自 http://artima.com/pins1ed/type-para
我看到 SML/NJ 包含一个队列结构。我不知道如何使用它。如何使用 SML/NJ 提供的附加库? 最佳答案 Queue structure SML '97 未指定,但它存在于 SML/NJ 的顶级环
我是 D3 和 JavaScript 的新手。 我试图理解其中的 queue.js。 我已经完成了 this关联。但是仍然无法清楚地了解 queue.await() 和 queue.awaitAll(
所以我试图在我的 main.cpp 文件中调用一个函数,但我得到“错误:没有匹配函数来调用‘Queue::Queue()。” 队列.h #ifndef QUEUE_H #define QUEUE_H
假设我有一个 10 行的二维 numpy 数组 例如 array([[ 23425. , 521331.40625], [ 23465. , 521246.03125],
我是一名优秀的程序员,十分优秀!