dispatch_after - GCD in Swift?

前端 未结 25 2447
心在旅途
心在旅途 2020-11-21 06:07

I\'ve gone through the iBook from Apple, and couldn\'t find any definition of it:

Can someone explain the structure of dispatch_after?

d         


        
25条回答
  •  野性不改
    2020-11-21 06:31

    Another helper to delay your code that is 100% Swift in usage and optionally allows for choosing a different thread to run your delayed code from:

    public func delay(bySeconds seconds: Double, dispatchLevel: DispatchLevel = .main, closure: @escaping () -> Void) {
        let dispatchTime = DispatchTime.now() + seconds
        dispatchLevel.dispatchQueue.asyncAfter(deadline: dispatchTime, execute: closure)
    }
    
    public enum DispatchLevel {
        case main, userInteractive, userInitiated, utility, background
        var dispatchQueue: DispatchQueue {
            switch self {
            case .main:                 return DispatchQueue.main
            case .userInteractive:      return DispatchQueue.global(qos: .userInteractive)
            case .userInitiated:        return DispatchQueue.global(qos: .userInitiated)
            case .utility:              return DispatchQueue.global(qos: .utility)
            case .background:           return DispatchQueue.global(qos: .background)
            }
        }
    }
    

    Now you simply delay your code on the Main thread like this:

    delay(bySeconds: 1.5) { 
        // delayed code
    }
    

    If you want to delay your code to a different thread:

    delay(bySeconds: 1.5, dispatchLevel: .background) { 
        // delayed code that will run on background thread
    }
    

    If you prefer a Framework that also has some more handy features then checkout HandySwift. You can add it to your project via Carthage then use it exactly like in the examples above, e.g.:

    import HandySwift    
    
    delay(bySeconds: 1.5) { 
        // delayed code
    }
    

提交回复
热议问题