2013-03-07 159 views
9

我一直在研究一个应用程序,用户可以使用AVFoundation录制视频并发送到服务器,视频最大可达15M,具体取决于互联网的速度&类型它可以从大约1到5分钟将视频传输到服务器。我正在后台线程中将录制的视频传输到服务器,以便用户可以在视频上传到服务器时继续播放应用中的其他内容。在后台实现长时间运行的任务IOS

在阅读Apple Docs的implementing long running tasks in backround时,我发现只有少数几种应用可以在后台执行。
例如

audio-app在后台播放可听内容给用户。 (此内容包括使用AirPlay播放音频或视频内容。)

它是否符合我的应用程序还用于在后台运行任务?或者我需要在主线程上传输视频?

+0

る要上传背景的录像? – Ganapathy 2013-03-07 10:36:41

+0

是的,这是我正在做的,因为我提到我希望用户在录制视频时继续在窗体上做其他事情 – nsgulliver 2013-03-07 10:37:06

+0

上传时,应用会在前台(执行其他任务),或者它会进入完全的背景? – Ganapathy 2013-03-07 10:40:33

回答

13

NSOperationQueue是执行多线程任务以避免阻塞主线程的推荐方式。后台线程用于您希望在应用程序处于非活动状态时执行的任务,如GPS指示或音频流。

如果您的应用程序在前台运行,则根本不需要后台线程。

对于简单的任务,你可以在操作使用块添加到队列:

NSOperationQueue* operationQueue = [[NSOperationQueue alloc] init]; 
[operationQueue addOperationWithBlock:^{ 
    // Perform long-running tasks without blocking main thread 
}]; 

更多信息有关NSOperationQueuehow to use it

上传过程将在后台继续,但您的应用程序将有资格被暂停,因此上传可能会取消。为了避免它,你可以将下面的代码添加到应用程序委托告诉OS时,应用程序已准备好暂停:

- (void)applicationWillResignActive:(UIApplication *)application { 
    bgTask = [application beginBackgroundTaskWithExpirationHandler:^{ 

     // Wait until the pending operations finish 
     [operationQueue waitUntilAllOperationsAreFinished]; 

     [application endBackgroundTask: bgTask]; 
     bgTask = UIBackgroundTaskInvalid; 
    }]; 
} 
+0

这是否意味着如果用户点击电源按钮,“NSOperationQueue”将继续其任务? – nsgulliver 2013-03-07 11:04:48

+0

查看已更新的答案,以避免应用在非活动状态时被暂停。 – redent84 2013-03-07 11:33:10

+0

向NSOperationQueue添加'*'符号''''''操作步骤 – Salim 2013-10-08 14:18:20

4

你的要求有资格在后台运行。您不需要注册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; 
});} 
+0

来自Apple Docs,这并不清楚,这就是为什么我问,我已经在后台线程中实现了我的上传过程,并且我已经在使用多任务处理,我的问题是,如果它已经在后台线程中运行,它会让我的应用程序被拒绝吗?其次,我的应用程序可以处于活动状态或非活动状态,并不重要,因为它正在后台线程中执行任务。 – nsgulliver 2013-03-07 10:55:14

+1

@nsgulliver否。Apple不会因为使用后台处理程序上传而拒绝。所有你需要做的就是确保你在10分钟的时间内停止处理程序,否则应用程序可能会被操作系统强制终止。我在一些应用程序中这样做了,而且我对Apple没有任何问题。 – Ravi 2013-03-07 12:10:20

5

从您对Dwayne的回应中,您无需在后台模式下进行下载。相反,您需要的是在主线程旁边的另一个线程(后台线程)中进行下载。事情是这样的GCD:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
//  Do you download here... 
    }); 
+0

它正在向服务器上传数据,我担心的是,如果互联网在某段时间后出现故障,它会恢复我的工作吗?根据我的理解,将不得不在NSOperationQueue中添加任务,如果他们正在等待,那么可以恢复? – nsgulliver 2013-03-07 12:00:04

+1

无论上传任务是否能够在失去与服务器的连接后恢复,都取决于您使用的库是否具有此功能。如果该库不支持该功能,则将任务作为后台任务或后台线程运行将无济于事。 – user523234 2013-03-07 23:34:44

+0

那些有能力恢复和哪些不能恢复的库? – nsgulliver 2013-03-08 09:03:49