Swift - dispatch_after 的替代方案

Swift - alternative to dispatch_after

Swift/SO 这里是新手 - 会尽量说清楚!

我有一个 @IBActionwkinterfacepicker 调用。这会调用一个函数,该函数可能会再次更改选择器 - 这反过来会导致 @IBAction 再次被触发,因此可能导致不需要的循环类型行为。

我想做的是将控制权传递给第二个函数,而不是调用from/return给 @IBAction 函数。我有一个使用 dispatch_after 的可行解决方案,实现了任意延迟,以便 @IBAction 在第二个函数开始之前完成,但这似乎不是很 elegant/appropriate。

大致如下所示:

@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 函数退出时将控制权传递给第二个函数?或者我完全走错了路?

提前感谢您抽出宝贵时间查看此内容!

与其选择一个随机延迟然后 运行 您的代码,另一种方法是将您的代码块异步放入主队列。这将在当前 运行 循环完成后 运行,因此您不必计算要等待多长时间。

即代替

dispatch_after(...

尝试

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