首页 文章

Swift - dispatch_after的替代品

提问于
浏览
2

Swift / SO新手在这里 - 将尽力清楚!

我有 @IBAction 来自 wkinterfacepicker . 这会调用一个可能再次更改选择器的函数 - 这会导致再次触发 @IBAction ,从而导致不必要的循环类型行为 .

我想要做的是让控制传递给第二个函数,而不是从/返回到 @IBAction 函数 . 我有一个使用 dispatch_after 的工作解决方案,实现任意延迟,以便 @IBAction 在第二个func启动之前完成,但这似乎不是非常优雅/合适 .

这大致是这样的:

@IBAction func freePickerChanged(value: Int) {
    selectedValue = value

    let triggerTime = (Int64(NSEC_PER_SEC) * 1)
        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, triggerTime), dispatch_get_main_queue(), { () -> Void in
            self.changeValues()
    })
    // Without using dispatch_after, program control returns here from changeValues(), causing loop
}

//Ideally would call changeValues() here, after @IBAction exits

func changeValues() {
    //Do some calculations here. Perhaps the picker needs to be changed again using setSelectedItemIndex -  @IBACTION KICKED OFF AGAIN
}

是否有更好的方法将控制权从@IBAction func传递到第二个函数?或者我可能完全走错了轨道?

提前感谢您抽出宝贵时间来看看这个!

1 回答

  • 1

    另一种方法是将代码块异步地放入主队列,而不是在运行代码之后选择随机延迟 . 这将在当前运行循环完成后运行,因此您不必计算等待的时间 .

    而不是

    dispatch_after(...
    

    尝试

    dispatch_async(dispatch_get_main_queue()) {
        // your code here
    }
    

相关问题