加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Swift – scheduledTimerWithTimeInterval – NSInvocation

发布时间:2020-12-14 04:41:31 所属栏目:百科 来源:网络整理
导读:我想在将来安排一个函数调用.我正在使用 Swift. 我想回调一个私有的方法并返回一个Promise(来自PromiseKit) 我见过的所有例子都使用了 NSTimer.scheduledTimerWithTimeInterval(ti: NSTimeInterval,target: AnyObject,selector: Selector,userInfo: AnyObjec
我想在将来安排一个函数调用.我正在使用 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() })

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读