在后台实现长时间运行的任务IOS
我一直在研究一个应用程序,用户可以使用AVFoundation
录制视频并发送到服务器,视频最大可达15M,具体取决于互联网的速度&类型它可以从大约1到5分钟将视频传输到服务器。我正在后台线程中将录制的视频传输到服务器,以便用户可以在视频上传到服务器时继续播放应用中的其他内容。在后台实现长时间运行的任务IOS
在阅读Apple Docs的implementing long running tasks in backround时,我发现只有少数几种应用可以在后台执行。
例如
audio-app在后台播放可听内容给用户。 (此内容包括使用AirPlay播放音频或视频内容。)
它是否符合我的应用程序还用于在后台运行任务?或者我需要在主线程上传输视频?
NSOperationQueue
是执行多线程任务以避免阻塞主线程的推荐方式。后台线程用于您希望在应用程序处于非活动状态时执行的任务,如GPS指示或音频流。
如果您的应用程序在前台运行,则根本不需要后台线程。
对于简单的任务,你可以在操作使用块添加到队列:
NSOperationQueue* operationQueue = [[NSOperationQueue alloc] init];
[operationQueue addOperationWithBlock:^{
// Perform long-running tasks without blocking main thread
}];
更多信息有关NSOperationQueue和how to use it。
上传过程将在后台继续,但您的应用程序将有资格被暂停,因此上传可能会取消。为了避免它,你可以将下面的代码添加到应用程序委托告诉OS时,应用程序已准备好暂停:
- (void)applicationWillResignActive:(UIApplication *)application {
bgTask = [application beginBackgroundTaskWithExpirationHandler:^{
// Wait until the pending operations finish
[operationQueue waitUntilAllOperationsAreFinished];
[application endBackgroundTask: bgTask];
bgTask = UIBackgroundTaskInvalid;
}];
}
这是否意味着如果用户点击电源按钮,“NSOperationQueue”将继续其任务? – nsgulliver 2013-03-07 11:04:48
查看已更新的答案,以避免应用在非活动状态时被暂停。 – redent84 2013-03-07 11:33:10
向NSOperationQueue添加'*'符号''''''操作步骤 – Salim 2013-10-08 14:18:20
你的要求有资格在后台运行。您不需要注册info plist支持的任何背景模式。所有你需要做的是,当应用程序即将进入后台时,使用后台任务处理程序请求额外的时间并在该块中执行你的任务。确保你在10分钟之前停止你的处理程序,以便不被操作系统强制终止。
您可以使用Apple的以下代码。
- (void)applicationDidEnterBackground:(UIApplication *)application
{
bgTask = [application beginBackgroundTaskWithExpirationHandler:^{
// Clean up any unfinished task business by marking where you
// stopped or ending the task outright.
[application endBackgroundTask:bgTask];
bgTask = UIBackgroundTaskInvalid;
}];
// Start the long-running task and return immediately.
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// Do the work associated with the task, preferably in chunks.
[application endBackgroundTask:bgTask];
bgTask = UIBackgroundTaskInvalid;
});}
来自Apple Docs,这并不清楚,这就是为什么我问,我已经在后台线程中实现了我的上传过程,并且我已经在使用多任务处理,我的问题是,如果它已经在后台线程中运行,它会让我的应用程序被拒绝吗?其次,我的应用程序可以处于活动状态或非活动状态,并不重要,因为它正在后台线程中执行任务。 – nsgulliver 2013-03-07 10:55:14
@nsgulliver否。Apple不会因为使用后台处理程序上传而拒绝。所有你需要做的就是确保你在10分钟的时间内停止处理程序,否则应用程序可能会被操作系统强制终止。我在一些应用程序中这样做了,而且我对Apple没有任何问题。 – Ravi 2013-03-07 12:10:20
从您对Dwayne的回应中,您无需在后台模式下进行下载。相反,您需要的是在主线程旁边的另一个线程(后台线程)中进行下载。事情是这样的GCD:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// Do you download here...
});
它正在向服务器上传数据,我担心的是,如果互联网在某段时间后出现故障,它会恢复我的工作吗?根据我的理解,将不得不在NSOperationQueue中添加任务,如果他们正在等待,那么可以恢复? – nsgulliver 2013-03-07 12:00:04
无论上传任务是否能够在失去与服务器的连接后恢复,都取决于您使用的库是否具有此功能。如果该库不支持该功能,则将任务作为后台任务或后台线程运行将无济于事。 – user523234 2013-03-07 23:34:44
那些有能力恢复和哪些不能恢复的库? – nsgulliver 2013-03-08 09:03:49
る要上传背景的录像? – Ganapathy 2013-03-07 10:36:41
是的,这是我正在做的,因为我提到我希望用户在录制视频时继续在窗体上做其他事情 – nsgulliver 2013-03-07 10:37:06
上传时,应用会在前台(执行其他任务),或者它会进入完全的背景? – Ganapathy 2013-03-07 10:40:33