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() }) 鉴于您实际上可以选择运行哪个线程,这是非常接近的;-) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |