2016-06-07 178 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