为什么不应直接使用.default QoS?它与不指定QoS有区别吗?
关于不推荐直接使用.default QoS的原因说明
你对.default QoS的理解存在核心偏差:它和不指定QoS的效果完全不同,这也是苹果不推荐开发者直接使用的核心原因,具体原因如下:
- 优先级继承逻辑被破坏:GCD默认有QoS自动继承机制,当你派发任务不指定QoS时,任务会自动继承当前调用上下文的QoS等级:比如你在UI线程(对应
.userInteractive优先级)派发异步任务,没有指定QoS的话任务会自动拿到.userInteractive优先级,保证响应速度;但如果你硬编码.default,就会直接覆盖继承逻辑,将任务优先级固定为介于.userInitiated和.utility之间的默认等级,本该快速响应的任务可能被延后执行,导致UI卡顿等问题。 - 不符合系统调度设计初衷:
.default本质是苹果留给系统内部使用的过渡优先级,并不是面向开发者开放的业务场景分级。开发者手动指定.default的话,系统无法根据任务的实际业务属性做功耗、CPU/GPU资源的动态调度,比如后台上传类任务本应用.background优先级降低资源占用,你错用.default会导致不必要的功耗浪费。 - 可维护性差:
.default本身没有任何业务语义,其他开发者维护代码时无法判断你这个任务的优先级需求:是需要用户等待的即时任务?还是后台可以慢慢跑的非即时任务?远不如直接指定.userInteractive/.userInitiated/.utility/.background这些语义明确的等级清晰。
补充说明:只有当当前上下文没有任何可继承的QoS信息时,无指定QoS的任务才会落到.default等级,这种场景在正常的业务开发中极少出现,完全不需要开发者手动指定。
内容的提问来源于stack exchange,提问作者Andoni Da Silva
相关产品推荐
相关产品推荐

