2013-03-07 140 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

相關問題