2017-08-06 52 views
0

我有這樣的對象:如何暫停/恢復DispatchWorkItem斯威夫特

lockWallTask = DispatchWorkItem(block: { 
     self.lockWall() 
    }) 
    DispatchQueue.main.asyncAfter(deadline: .now() + 10, execute: lockWallTask) 

所以這10秒後執行。但是,我試圖暫停此項目,然後繼續。例如:

我會在3秒後暫停該項目,這意味着還有7秒鐘可以執行。我做了其他的東西像5分鐘,然後我恢復項目,還剩下7秒執行。我試圖做到這一點的生活這一點:

DispatchQueue.resume(task) 

DispatchQueue.suspend(task) 

不過,我得到這個編譯錯誤:

enter image description here

我不明白的錯誤。可變任務類型爲「DispatchWorkItem」

我將如何實現暫停,或者暫停,一個DispatchWorkItem然後恢復呢?

+0

嘗試'DispatchQueue.main.resume()' –

+0

是不是會恢復並暫停所有的DispatchObjects?我有幾個對象運行@AdrianBobrowski – Pablo

+0

是的它暫停和恢復在這個'DispatchQueue' –

回答

0

您需要使用DispatchSource定時器,您可以暫停,恢復和停止並相應地執行您的操作。

var timer: DispatchSource? 

func resumeTimer() { 
    guard let timer = DispatchSource.makeTimerSource(flags: DispatchSource.TimerFlags(rawValue: 0), queue: mainQueue) as? DispatchSource else { return } 
    timer.setEventHandler { 
     mainQueue.async(execute: { [weak self] in 
      self?.runTimer() 
     }) 
    } 
    timer.scheduleRepeating(deadline: .now(), interval: .seconds(10), leeway: .seconds(1)) 
    timer.resume() 
} 

func pausedTimer() { 
    if let timer = timer { 
     timer.suspend() 
    } 
} 

func stoppedTimer() { 
    if let timer = timer { 
     timer.cancel() 
    } 
}