可以在每个线程的基础上调用 [NSProcessInfo beginActivityWithOptions] 和 [NSProcessInfo endActivity] 吗?

Is it okay to call [NSProcessInfo beginActivityWithOptions] and [NSProcessInfo endActivity] on a per-thread basis?

我有一个 MacOS/X 应用程序,它通常不反对应用程序打盹,但有时它会产生一个或多个子线程来执行对时间敏感的网络任务,这确实需要避免正在打瞌睡。

最好的做法是让每个线程在启动时调用 [[NSProcess processInfo] beginActivityWithOptions [...]],并在退出前调用 [[NSProcess processInfo] endActivity [...]],这(希望)会产生以下效果仅当这些网络线程中的一个或多个为 [​​=22=].

时,才避免在我的进程(或至少在那些特定线程上)上应用小睡

我的问题是,这是一个 legal/acceptable 调用模式,还是 NSProcessInfo 更像是一种只针对每个进程的 API 不实现线程的模式-如果我从多个线程调用它,可靠地产生预期行为所必需的安全引用计数逻辑? (如果是后者,我可以自己实现那个逻辑,但我不想在这里重新发明轮子)

这个 API 被认为是进程范围的,报告你的 entire Application 正在做特定类型的工作,应该或不应该受节电启发式(这是,同样,每个进程,而不是每个线程)。

最好的使用方法是在所有后台线程启动之前开始一个 activity,并在所有重要的后台线程完成后结束它。

您可以使用 DispatchGroup 或您希望的任何其他工具来完成。

但这不是唯一的方法。

beginActivityWithOptions 会 return _NSActivityAssertion,它通常不了解线程。你可以为这个派对带来你自己的线程同步机制。

多次调用此 API 将创建多个 _NSActivityAssertion 对象,这绝对是多余的,但如果您正确结束每个对象,应该可以工作。

首先,这个 API 应该或不应该受到节能启发式算法的影响。

最好的使用方法是将其与调度组一起使用