可否针对单线程调用NSProcessInfo的beginActivity与endActivity接口
解答
你的调用模式完全合法,是苹果官方推荐的标准实现,不需要自己额外造轮子。
首先明确两点:
NSProcessInfo的activity系列API本身就是线程安全的,内部自带原子化的引用计数逻辑,你在任意子线程成对调用[[NSProcessInfo processInfo] beginActivityWithOptions:...]和[[NSProcessInfo processInfo] endActivity:]都不会出现计数混乱的问题。- 该API的计数逻辑是全局进程级的:每成功调用一次begin就给对应活动的计数+1,调用一次end就对应-1,只要计数大于0,系统就不会将你的应用纳入App Nap候选范围,刚好符合你「只要有一个时序敏感线程在运行就禁用App Nap」的需求。
有两个注意事项需要留意:
- 必须保证begin和end严格成对执行,哪怕线程抛出异常、提前退出也要确保end方法被调用,可以用@try/@finally包裹逻辑避免出现泄漏,一旦泄漏会导致应用永远无法进入App Nap,造成不必要的功耗浪费。
- 执行网络任务时建议选择匹配的activity选项,普通时序敏感任务选
NSActivityUserInitiated即可,如果允许系统在任务执行期间 idle 休眠可以选NSActivityUserInitiatedAllowingIdleSystemSleep,不要选择过高权限的活动类型,避免无谓的系统资源占用。
内容的提问来源于stack exchange,提问作者Jeremy Friesner
相关产品推荐
相关产品推荐

