首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Swift performSelector:withObject:afterDelay:不可用

Swift performSelector:withObject:afterDelay:不可用
EN

Stack Overflow用户
提问于 2014-06-12 02:43:08
回答 3查看 116.9K关注 0票数 138

我在Objective C中有一个正在过渡到Swift的应用程序。在Objective C中,我有这样的方法:

[self.view performSelector:@selector(someSelector) withObject:self afterDelay:0.1f];

我正在和Swift一起工作,但我不知道该怎么做。我试过了:

self.view.performSelector(Selector("someSelector"), withObject: self, afterDelay: 0.1)

下面是我得到的错误:'performSelector' is unavailable: 'performSelector' methods are unavailable

我将使用什么调用来调用方法afterDelay

更新

这是我最终得到的结论:

代码语言:javascript
复制
extension NSObject {

    func callSelectorAsync(selector: Selector, object: AnyObject?, delay: NSTimeInterval) -> NSTimer {

        let timer = NSTimer.scheduledTimerWithTimeInterval(delay, target: self, selector: selector, userInfo: object, repeats: false)
        return timer
    }

    func callSelector(selector: Selector, object: AnyObject?, delay: NSTimeInterval) {

        let delay = delay * Double(NSEC_PER_SEC)
        let time = dispatch_time(DISPATCH_TIME_NOW, Int64(delay))
        dispatch_after(time, dispatch_get_main_queue(), {
            NSThread.detachNewThreadSelector(selector, toTarget:self, withObject: object)
        })
    }
}
EN

回答 3

Stack Overflow用户

发布于 2014-06-12 03:11:13

Swift 4

代码语言:javascript
复制
DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
    // your function here
}

Swift 3

代码语言:javascript
复制
DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(0.1)) {
    // your function here
}

Swift 2

代码语言:javascript
复制
let dispatchTime: dispatch_time_t = dispatch_time(DISPATCH_TIME_NOW, Int64(0.1 * Double(NSEC_PER_SEC))) 
dispatch_after(dispatchTime, dispatch_get_main_queue(), { 
    // your function here 
})
票数 159
EN

Stack Overflow用户

发布于 2014-06-12 03:13:17

你可以这样做:

代码语言:javascript
复制
var timer = NSTimer.scheduledTimerWithTimeInterval(0.1, target: self, selector: Selector("someSelector"), userInfo: nil, repeats: false)

func someSelector() {
    // Something after a delay
}

SWIFT 3

代码语言:javascript
复制
let timer = Timer.scheduledTimer(timeInterval: 0.1, target: self, selector: #selector(someSelector), userInfo: nil, repeats: false)

func someSelector() {
    // Something after a delay
}
票数 111
EN

Stack Overflow用户

发布于 2014-06-12 02:46:43

Swift是静态类型的,所以performSelector:方法会被搁置。

相反,使用GCD将合适的块分派到相关队列-在本例中,它可能是主队列,因为它看起来像是在做UIKit工作。

编辑:the Swift version of the NSRunLoop documentation中也明显缺少相关的performSelector: ("1 Objective-C symbol hidden"),所以你不能直接跳进去。考虑到这一点,再加上Swiftified NSObject中没有苹果,我认为苹果的想法很明显。

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24170282

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档