web-dev-qa-db-ja.com

Swift performSelector:withObject:afterDelay:は使用できません

私はSwiftに移行しているObjective Cのアプリを持っています。 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を呼び出すためにどんな呼び出しを使用しますか?

UPDATE

これが私が最後になったものです:

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)
        })
    }
}
131
Cody Winton

Swift 4

DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
    // your function here
}

Swift

DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(0.1)) {
    // your function here
}

Swift 2

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 
})
150
brandonscript

あなたはこれをすることができます:

var timer = NSTimer.scheduledTimerWithTimeInterval(0.1, target: self, selector: Selector("someSelector"), userInfo: nil, repeats: false)

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

スイフト3

let timer = Timer.scheduledTimer(timeInterval: 0.1, target: self, selector: #selector(someSelector), userInfo: nil, repeats: false)

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

Swiftは静的に型付けされているので、performSelector:メソッドは脇に落ちることになります。

代わりに、GCDを使用して適切なブロックを関連するキューにディスパッチします。この場合、UIKit作業を行っているように見えるので、それがおそらくメインキューになります。

編集:関連するperformSelector:Swift版のNSRunLoopのドキュメント ( "1 Objective-C symbol hidden")から特に抜けているので、それに直接ジャンプすることはできません。それがあり、それがSwiftified NSObjectから抜けていることから、Appleがここで考えていることはかなり明確であると私は主張します。

9
Tommy