Swift - dispatch_after 的替代方案
Swift - alternative to dispatch_after
Swift/SO 这里是新手 - 会尽量说清楚!
我有一个 @IBAction
被 wkinterfacepicker
调用。这会调用一个函数,该函数可能会再次更改选择器 - 这反过来会导致 @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
}
Swift/SO 这里是新手 - 会尽量说清楚!
我有一个 @IBAction
被 wkinterfacepicker
调用。这会调用一个函数,该函数可能会再次更改选择器 - 这反过来会导致 @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
}