亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在斯威夫特的GCD后派人去嗎?

在斯威夫特的GCD后派人去嗎?

iOS
慕仙森 2019-05-30 16:23:41
在斯威夫特的GCD后派人去嗎?我經歷了iBook來自蘋果,卻找不到它的任何定義:有人能解釋一下…的結構嗎?dispatch_after?dispatch_after(<#when: dispatch_time_t#>, <#queue: dispatch_queue_t?#>, <#block: dispatch_block_t?#>)
查看完整描述

4 回答

?
侃侃爾雅

TA貢獻1801條經驗 獲得超16個贊

我用dispatch_after通常,我編寫了一個頂級實用程序函數來簡化語法:

func delay(delay:Double, closure:()->()) {
    dispatch_after(
        dispatch_time(
            DISPATCH_TIME_NOW,
            Int64(delay * Double(NSEC_PER_SEC))
        ),
        dispatch_get_main_queue(), closure)}

現在你可以這樣說話了:

delay(0.4) {
    // do stuff}

哇,一種你可以提高語言的語言。還有比這更好的嗎?


更新SWIFT 3,Xcode 8種子6

既然它們已經改進了調用語法,似乎幾乎不值得去費心:

func delay(_ delay:Double, closure:@escaping ()->()) {
    let when = DispatchTime.now() + delay    DispatchQueue.main.asyncAfter(deadline: when, execute: closure)}


查看完整回答
反對 回復 2019-05-30
?
呼喚遠方

TA貢獻1856條經驗 獲得超11個贊

為了擴展Cezary的答案,它將在1納秒后執行,我必須在4秒半后執行以下操作。

let delay = 4.5 * Double(NSEC_PER_SEC)let time = dispatch_time(DISPATCH_TIME_NOW, Int64(delay))dispatch_after(time, dispatch_get_main_queue(), 
block)

編輯:我發現我的原始代碼稍有錯誤。如果不將nsec_per_sec強制轉換為Double,則隱式類型將導致編譯錯誤。

如果有人能提出更好的解決方案,我很想聽聽。

=SWIFT 3的更新=

在SWIFT 3中,這是非常簡單和優雅的:

DispatchQueue.main.asyncAfter(deadline: .now() + 4.5) {
    // ...}


查看完整回答
反對 回復 2019-05-30
?
千巷貓影

TA貢獻1829條經驗 獲得超7個贊

如果需要使該塊失效,您可能需要使用以下命令:

typealias dispatch_cancelable_closure = (cancel : Bool) -> Voidfunc delay(time:NSTimeInterval, closure:()->Void) ->  dispatch_cancelable_closure? {

    func dispatch_later(clsr:()->Void) {
        dispatch_after(
            dispatch_time(
                DISPATCH_TIME_NOW,
                Int64(time * Double(NSEC_PER_SEC))
            ),
            dispatch_get_main_queue(), clsr)
    }

    var closure:dispatch_block_t? = closure    var cancelableClosure:dispatch_cancelable_closure?

    let delayedClosure:dispatch_cancelable_closure = { cancel in
        if closure != nil {
            if (cancel == false) {
                dispatch_async(dispatch_get_main_queue(), closure!);
            }
        }
        closure = nil
        cancelableClosure = nil
    }

    cancelableClosure = delayedClosure

    dispatch_later {
        if let delayedClosure = cancelableClosure {
            delayedClosure(cancel: false)
        }
    }

    return cancelableClosure;}func cancel_delay(closure:dispatch_cancelable_closure?) {

    if closure != nil {
        closure!(cancel: true)
    }}

用途如下

let retVal = delay(2.0) {
    println("Later")}delay(1.0) {
    cancel_delay(retVal)}

學分


查看完整回答
反對 回復 2019-05-30
  • 4 回答
  • 0 關注
  • 555 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號