GCD 允许根据 4 个全局优先级队列(高、默认、低、背景)将块分派到队列。我的应用程序中有几个 NSOperationQueues,但希望以不同的优先级运行每个。据我了解 NSOperationQueue 是对 GCD 的抽象,并且希望为 NSOperationQueue 设置不同的优先级(类似于 GCD 优先级队列)。有没有办法这样做?(发现可以为操作设置优先级,但不能为队列本身设置优先级)。
3 回答
从 iOS 8 开始, NSOperationQueue 有一个qualityOfService
属性,我认为它是 OP 的意思。从类参考:
此属性指定应用于添加到队列的操作对象的服务级别。如果操作对象具有明确的服务级别集,则使用该值。[...]
服务级别影响操作对象访问系统资源(如 CPU 时间、网络资源、磁盘资源等)的优先级。具有更高服务质量级别的操作被赋予比系统资源更高的优先级,以便它们可以更快地执行其任务。您使用服务级别来确保响应显式用户请求的操作优先于不太重要的工作。
同样在 iOS 8 中,您可以通过该underlyingQueue
属性更改使用哪个 GCD 队列,从而选择具有所需优先级的全局 GCD 队列。
来自NSOperationQueue 类参考的引用。
队列中的操作(但尚未执行)本身根据优先级和操作对象依赖关系进行组织,并相应地执行。
操作间的依赖关系为操作提供了绝对的执行顺序,即使这些操作位于不同的操作队列中。直到其所有相关操作都完成执行后,才认为操作对象已准备好执行。对于准备好执行的操作,操作队列总是执行相对于其他准备好的操作具有最高优先级的操作。
这意味着按照设计,您不能为队列设置优先级,但 NSOperationQueue 将根据操作的各个优先级将 GCD 全局队列用于各个操作。
尝试设置threadPriority
添加到队列的 NSOperations。