微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Swift – scheduledTimerWithTimeInterval – NSInvocation

我想在将来安排一个函数调用.我正在使用 Swift.

我想回调一个私有的方法并返回一个Promise(来自PromiseKit)

我见过的所有例子都使用了

NSTimer.scheduledTimerWithTimeInterval(ti: NSTimeInterval,target: AnyObject,selector: Selector,userInfo: AnyObject?,repeats: Bool)

精细.我试过了

NSTimer.scheduledTimerWithTimeInterval(1,target: self,selector: "connect",userInfo: nil,repeats: false)

使用Objective-C选择器’connect’声明的No方法失败了.

什么是Objective-C在这做什么?

无论如何,建议我在我的方法连接前添加@objc.精细.好吧,我不能,因为显然Method不能标记为@objc,因为它的结果类型不能用Objective-C表示

如果我想使用Objective-C我不会写Swift …

还有另一个scheduledTimerWithTimeInterval

NSTimer.scheduledTimerWithTimeInterval(ti: NSTimeInterval,invocation: NSInvocation,repeats: Bool)

但是从我所看到的NSInvocation不是一个Swift的东西……

所以我最终创建了一个包装器,除了调用connect和返回Void之外什么也没做,Objective C可以理解.它有效,但感觉非常愚蠢.有更好的Swift方式吗?

额外奖励:为什么javascript可以像setTimeout(this.connect,1)那样简单地执行,而Swift没有内置的方法可以找到?

解决方法

从iOS 10和Swift 3开始,可以使用带有块闭包的(NS)Timer,从而避免在计时器触发时调用Objective-C选择器:

if #available(iOS 10.0,*) {
        Timer.scheduledTimer(withTimeInterval: 1.0,repeats: false,block: { (Timer) in
            self.connect() // per the OP's example
        })
    }

除了避免@objc装饰器之外,使用此技术还允许您调用包含非Objective-C兼容参数类型(如枚举和选项)的方法.

Re:setTimeout(this.connect,1)来自Javascript,如果你不需要取消它,在Swift 3中更直接的比喻可能是:

dispatchQueue.Main.asyncAfter(deadline: .Now() + 1.0,execute { self.connect() })

鉴于您实际上可以选择运行哪个线程,这是非常接近的;-)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐