在选择器上调用 cancelPreviousPerformRequestsWithTarget: 是否也会取消内部方法调用?

does calling cancelPreviousPerformRequestsWithTarget: on a selector cancel internal method calls as well?

我有一个选择器方法,它在使用 dispatch_async.

调用的两个不同线程中的两个不同库中搜索特定文本

现在这个选择器绑定到一个文本字段,一旦某些字符发生变化,我们就可以查询库中的文本。

现在搜索需要一些时间,比如 0.3 - 0.4 秒,如果在输入另一个字符之前第一次搜索未完成,我想取消搜索并在文本字段中重新开始新字符。

那么在选择器上调用 cancelPreviousPerformRequestsWithTarget 是否会取消内部线程和库调用...?

没有。 cancelPreviousPerformRequestsWithTarget 与通过 GCD 分派的块无关(即 dispatch_async)。它取消了以前的调用 使用 -performSelector:withObject:afterDelay: 安排在特定 NSRunLoop 稍后时间的选择器。此外,它无法取消那些已经在进行中的调用,如果它们仍在等待开始,它只能阻止它们开始。

没有办法(安全地)强行取消飞行操作,无论使用何种方法调度它们。该操作本身必须支持取消能力,通常是通过在其工作期间定期检查标志,并且 return 如果该标志表明该操作应该取消,则尽早执行。

因为难免有人会说NSOperation支持取消,所以我还是先把它说完,指出NSOperation的取消支持仍然需要被取消的操作定期检查标志并故意return早,只是NSOperationcancelled 属性提供了旗帜给你。为了对你有用,你的代码必须 知道 它作为 NSOperation 的一部分执行,并且它必须有一个指向特定 NSOperation 的指针] 它作为其中的一部分执行,它 仍然 必须在早期定期检查 NSOperation 和 return 的 cancelled 属性为了 "support cancellation."

在非垃圾收集运行时取消没有免费的午餐。