2010-12-05 68 views
24

我有一個使用OpenEars和Flite庫的應用程序。問題是Flite圖書館是資源密集型的,它凍結了我的應用程序。我懷疑在後臺線程上運行Flite會修復一些事情,但我有沒有的想法該怎麼做。幫助iOS上的多線程?

那就是說,我該如何在iOS中實現後臺線程

我很感激,如果有人能指點我一些教程,分享一些示例代碼,或任何一般的建議,可以幫助我解決這個問題。

+0

你一直能夠通過隊列或線程精簡OpenEars' FLITE庫? – Rasman 2011-12-15 20:04:08

+0

@Rasman - 老實說,我還沒有嘗試過,真的很忙。我正在研究另一個項目的多線程問題,所以我可能很快就會重新訪問。 – Moshe 2011-12-16 03:03:27

回答

45

蘋果的Concurrency Programming Guide是一個不錯的閱讀。併發編程並不是你想要從網上覆制一些示例代碼和黑客直到你快樂的東西。瞭解避免麻煩的選擇和原則是很好的。


在一段時間後重溫答案,現在你幾乎不能用Grand Central Dispatch出錯。運行在後臺任務看起來是這樣的:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
    [self doSomeLongTask]; // 1 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     [self longTaskDidFinish]; // 2 
    }); 
}); 

的長期任務(1)將一些後臺線程上運行,而且也沒有趕上,我知道的,即。該線程中已經有一個自動釋放池,您不必關心運行循環等。在任務完成後,主線程(2)上的代碼調用-longTaskDidFinish,以便您可以更新UI或其他任何內容。這是一個常用的習慣用法。

6

也許最好的辦法是this tutorial from Apple。我仔細閱讀(10-20分鐘)和「線程」我所有的應用程序!優秀!

0

斯威夫特3

DispatchQueue.global(qos: .userInteractive).async { 
    // Code to run on background thread 

    // Switch to the main UI thread to display any results needed 
    DispatchQueue.main.async { 
     // Run code on main UI thread here 
    } 
} 

qos參數代表 「服務質量」。認爲它像一個優先給你的後臺線程:

  • .userInteractive(最高優先級)
  • .userInitiated(當你能抽出幾秒鐘)
  • .utility(當你能抽出幾秒鐘到幾分鐘)
  • .background(最低優先級 - 分鐘/小時備用)