development

Swift performSelector : withObject : afterDelay :를 사용할 수 없습니다

big-blog 2020. 6. 29. 07:30
반응형

Swift performSelector : withObject : afterDelay :를 사용할 수 없습니다


이 질문에는 이미 답변이 있습니다.

Objective C에 Swift로 전환하는 앱이 있습니다. 목표 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합니까?

최신 정보

내가 끝내었던 것은 다음과 같습니다.

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

스위프트 4

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

스위프트 3

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

스위프트 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 
})

당신은 이것을 할 수 있습니다 :

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
}

스위프트는 정적으로 입력되므로 performSelector:메소드가 길가에 떨어집니다.

대신 GCD를 사용하여 적절한 큐를 관련 큐에 디스패치하십시오.이 경우 UIKit 작업을 수행하는 것처럼 보이기 때문에 아마도 기본 큐가됩니다.

EDIT: the relevant performSelector: is also notably missing from the Swift version of the NSRunLoop documentation ("1 Objective-C symbol hidden") so you can't jump straight in with that. With that and its absence from the Swiftified NSObject I'd argue it's pretty clear what Apple is thinking here.

참고URL : https://stackoverflow.com/questions/24170282/swift-performselectorwithobjectafterdelay-is-unavailable

반응형