IT

Swift perform Selector:withObject:afterDelay:는 사용할 수 없습니다.

itgroup 2023. 6. 2. 20:24
반응형

Swift perform Selector:withObject:afterDelay:는 사용할 수 없습니다.

나는 오브젝티브 C에 스위프트로 전환하는 앱이 있습니다.목표 C에서 나는 다음과 같은 방법을 사용합니다.

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

스위프트와 함께 일하고 있는데 어떻게 해야 할지 모르겠어요.시도해 봤습니다.

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
}

Swift는 정적으로 입력되므로performSelector:방법은 도중에 떨어지는 것입니다.

대신 GCD를 사용하여 적절한 블록을 관련 대기열로 전송합니다. 이 경우 UIKit 작업을 수행하는 것처럼 보이기 때문에 메인 대기열이 될 수 있습니다.

EDIT: 관련performSelector:또한 문서의 Swift 버전("1 Objective-C 기호 숨김")에서 특히 누락되어 있으므로 바로 뛰어들 수 없습니다.그것과 스위프트화된 것의 부재와 함께.NSObject저는 애플이 여기서 무슨 생각을 하고 있는지 매우 분명하다고 주장합니다.

언급URL : https://stackoverflow.com/questions/24170282/swift-performselectorwithobjectafterdelay-is-unavailable

반응형