在后台IOS中实现长时间运行的任务

nsg*_*ver 10 avfoundation ios

我一直在开发一个应用程序,用户可以使用该应用程序录制视频AVFoundation并发送到服务器,视频的最大大小可达15M,具体取决于互联网速度和类型,大约需要1到5分钟才能将视频传输到服务器.我正在将录制的视频传输到后台线程中的服务器,以便用户可以在视频上传到服务器时继续应用程序上的其他内容.

在阅读Apple Docs 以在后台实现长时间运行的任务时,我发现只允许几种应用程序在后台执行.
例如

audio-该应用程序在后台播放可听内容给用户.(此内容包括使用AirPlay播放音频或视频内容.)

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

red*_*t84 13

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

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

对于简单任务,您可以使用块向队列添加操作:

NSOperationQueue* operationQueue = [[NSOperationQueue alloc] init];
[operationQueue addOperationWithBlock:^{
    // Perform long-running tasks without blocking main thread
}];
Run Code Online (Sandbox Code Playgroud)

有关NSOperationQueue的更多信息以及如何使用它.

上传过程将在后台继续,但您的应用程序将有资格被暂停,因此上传可能会取消.为避免这种情况,您可以将以下代码添加到应用程序委托,以便在应用程序准备好挂起时通知操作系统:

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

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

      [application endBackgroundTask: bgTask];
      bgTask = UIBackgroundTaskInvalid;
    }]; 
}
Run Code Online (Sandbox Code Playgroud)


use*_*234 5

从您对Dwayne的回复中,您无需在后台模式下载.而你需要的是在主线程旁边的另一个线程(后台线程)中进行下载.对于GCD来说是这样的:

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
//        Do you download here...
    });
Run Code Online (Sandbox Code Playgroud)