39 lines
973 B
Swift
39 lines
973 B
Swift
//
|
|
// TimedOperation.swift
|
|
// TrueTime
|
|
//
|
|
// Created by Michael Sanders on 7/18/16.
|
|
// Copyright © 2016 Instacart. All rights reserved.
|
|
//
|
|
|
|
import Foundation
|
|
|
|
protocol TimedOperation: class {
|
|
var started: Bool { get }
|
|
var timeout: TimeInterval { get }
|
|
var timer: DispatchSourceTimer? { get set }
|
|
var timerQueue: DispatchQueue { get }
|
|
|
|
func debugLog(_ message: @autoclosure () -> String)
|
|
func timeoutError(_ error: NSError)
|
|
}
|
|
|
|
extension TimedOperation {
|
|
func startTimer() {
|
|
cancelTimer()
|
|
timer = DispatchSource.makeTimerSource(flags: [], queue: timerQueue)
|
|
timer?.schedule(deadline: .now() + timeout)
|
|
timer?.setEventHandler {
|
|
guard self.started else { return }
|
|
self.debugLog("Got timeout for \(self)")
|
|
self.timeoutError(NSError(trueTimeError: .timedOut))
|
|
}
|
|
timer?.resume()
|
|
}
|
|
|
|
func cancelTimer() {
|
|
timer?.cancel()
|
|
timer = nil
|
|
}
|
|
}
|