2016-06-07 179 views
1

至少從iOS 9開始,在主線程中未運行的核心數據操作的唯一未棄用的線程併發類型爲NSPrivateQueueConcurrencyType。 我現在的問題是,我想改變線程的優先級爲,像這樣:設置CoreData NSManagedObjectContext線程優先級

...:(int) neededPriority { 
    _queue = dispatch_queue_create("Worker", DISPATCH_QUEUE_SERIAL); 
    dispatch_set_target_queue(_queue, 
    dispatch_get_global_queue(neededPriority, 0)); 

有時候,我需要一個高優先級,有時低。但是當我調用[_privateContext performBlock:...]時,我無法傳遞具有所需優先級的參數,也沒有任何屬性設置其線程優先級。
因此我的問題:有沒有什麼方法可以將上下文隊列放入某個線程的優先級?

回答

0

NSManagedObjectContext實例被分配隊列,而不是線程。與performBlock例程相關聯的隊列可以運行任意後臺線程,因此您無法爲上下文分配普通優先級。

相反,從performBlock塊中可以調用NSThread.setThreadPriority來更改處理該塊的線程的優先級。

您可能希望在更改線程的優先級之前保存該線程的優先級,並在該塊的末尾重置該優先級。

+1

如果在主線程中使用'performBlockAndWait:',則隊列將在主線程上運行該塊。所以任何'NSThread'調用都將應用於主線程。 –

+0

謝謝,快速測試'NSLog(@「舊線程優先級:%f」,[NSThread threadPriority]);如果(![NSThread setThreadPriority:0.1]){ NSLog(@「Could not set priority!」); (@「New thread priority:%f」,[NSThread threadPriority]);顯示它似乎工作。 – Jan