作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试在 swift 3.0 中使用一些延迟(0.2 毫秒)调用一个方法,我想要的是第一次调用延迟的方法,当再次调用相同的方法时它应该取消以前的调用如果已经在 0.2 秒内被调用。我可以看到 objective-c 有 performSelector 和 cancelPreviousPerformRequestWithTarget 但我找不到 Swift 3.0 的任何相同示例,任何人都可以帮忙。
最佳答案
您的类必须是 NSObject
的子类才能获得这些方法。
class MyClass: NSObject {
func performAction(afterDelay delay: TimeInterval) {
perform(#selector(MyClass.action), with: self, afterDelay: delay)
}
func action(sender: Any?) {
print("action called")
}
func cancel() {
NSObject.cancelPreviousPerformRequests(withTarget: self, selector: #selector(MyClass.action), object: self)
}
}
但是,如果您只是需要在一些延迟后执行某些操作,则可以检查 GCD 方法。
DispatchQueue.main.asyncAfter(deadline: .now() + 0.2) {
//you action
}
关于Swift3版本的performSelector和cancelPreviousPerformRequestWithTarget,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43004371/
我已经使用performSelector启动了一个延迟线程,但用户仍然可以点击当前 View 上的后退按钮,从而导致调用dealloc。当发生这种情况时,我的线程似乎仍然被调用,这导致我的应用程序崩溃
我是一名优秀的程序员,十分优秀!