为了账号安全,请及时绑定邮箱和手机立即绑定

在斯威夫特的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条经验 获得超15个赞

我用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 关注
  • 502 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信