在选择器上调用 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早,只是NSOperation
有cancelled
属性提供了旗帜给你。为了对你有用,你的代码必须 知道 它作为 NSOperation
的一部分执行,并且它必须有一个指向特定 NSOperation
的指针] 它作为其中的一部分执行,它 仍然 必须在早期定期检查 NSOperation
和 return 的 cancelled
属性为了 "support cancellation."
在非垃圾收集运行时取消没有免费的午餐。
我有一个选择器方法,它在使用 dispatch_async
.
现在这个选择器绑定到一个文本字段,一旦某些字符发生变化,我们就可以查询库中的文本。
现在搜索需要一些时间,比如 0.3 - 0.4 秒,如果在输入另一个字符之前第一次搜索未完成,我想取消搜索并在文本字段中重新开始新字符。
那么在选择器上调用 cancelPreviousPerformRequestsWithTarget
是否会取消内部线程和库调用...?
没有。 cancelPreviousPerformRequestsWithTarget
与通过 GCD 分派的块无关(即 dispatch_async
)。它取消了以前的调用
使用 -performSelector:withObject:afterDelay:
安排在特定 NSRunLoop
稍后时间的选择器。此外,它无法取消那些已经在进行中的调用,如果它们仍在等待开始,它只能阻止它们开始。
没有办法(安全地)强行取消飞行操作,无论使用何种方法调度它们。该操作本身必须支持取消能力,通常是通过在其工作期间定期检查标志,并且 return 如果该标志表明该操作应该取消,则尽早执行。
因为难免有人会说NSOperation
支持取消,所以我还是先把它说完,指出NSOperation
的取消支持仍然需要被取消的操作定期检查标志并故意return早,只是NSOperation
有cancelled
属性提供了旗帜给你。为了对你有用,你的代码必须 知道 它作为 NSOperation
的一部分执行,并且它必须有一个指向特定 NSOperation
的指针] 它作为其中的一部分执行,它 仍然 必须在早期定期检查 NSOperation
和 return 的 cancelled
属性为了 "support cancellation."
在非垃圾收集运行时取消没有免费的午餐。