如何在 Swift 3 的主线程中延迟一段时间后调用函数?

A_t*_*ter 2 ios swift swift3

我有一个 UIControl,它会在 0.5 秒后调用一个函数,具体取决于用户按下它的次数。(例如,按 1 次调用 f1(),按 2 次调用 f2(),按 3 次调用 f3())

所以基本上我需要在用户按下 Control 时设置一个计时器。如果 0.5 秒内未按下 Control,则创建一个对话框。我尝试过使用 DispatchQueue,但是当它到达创建对话框时,需要几秒钟的时间。我认为这是因为它是同时调用的,而不是在主线程上调用的(如果术语不好,请原谅)。

self.operationQueue.cancelAllOperations() //To cancel previous queues
self.mainAsyncQueue = DispatchQueue(label: "bubblePressed" + String(describing: DispatchTime.now()), qos: DispatchQoS.default, attributes: DispatchQueue.Attributes.concurrent)

let time = DispatchTime.now()
self.currentTime = time

self.mainAsyncQueue!.asyncAfter(deadline: time + 0.5){
  guard self.currentTime == time else {
    return
  }

  let tempOperation = BlockOperation(block:{
    self.displayDialog()
  })
  self.operationQueue.addOperation(tempOperation)
}
Run Code Online (Sandbox Code Playgroud)

operationQueue并被mainAsycQueue定义viewDidLoad

self.currentTime = DispatchTime.now()
self.operationQueue = OperationQueue()
Run Code Online (Sandbox Code Playgroud)

如何displayDialog()在主线程中调用我的函数以使其加载速度更快?

ade*_*dev 5

根据问题标题,答案是:

let deadlineTime = DispatchTime.now() + .seconds(1)
DispatchQueue.main.asyncAfter(deadline: deadlineTime) {
   //update UI here
   self.displayDialog()
}
Run Code Online (Sandbox Code Playgroud)

或者

DispatchQueue.main.asyncAfter(deadline: .now() + 1) { 
   self.displayDialog()
}
Run Code Online (Sandbox Code Playgroud)