mirror of
https://github.com/samsonjs/Advanced-NSOperations.git
synced 2026-03-31 09:15:47 +00:00
56 lines
1.6 KiB
Swift
56 lines
1.6 KiB
Swift
/*
|
||
Copyright (C) 2015 Apple Inc. All Rights Reserved.
|
||
See LICENSE.txt for this sample’s licensing information
|
||
|
||
Abstract:
|
||
This file shows how to implement the OperationObserver protocol.
|
||
*/
|
||
|
||
import Foundation
|
||
|
||
/**
|
||
`TimeoutObserver` is a way to make an `Operation` automatically time out and
|
||
cancel after a specified time interval.
|
||
*/
|
||
struct TimeoutObserver: OperationObserver {
|
||
// MARK: Properties
|
||
|
||
static let timeoutKey = "Timeout"
|
||
|
||
private let timeout: NSTimeInterval
|
||
|
||
// MARK: Initialization
|
||
|
||
init(timeout: NSTimeInterval) {
|
||
self.timeout = timeout
|
||
}
|
||
|
||
// MARK: OperationObserver
|
||
|
||
func operationDidStart(operation: Operation) {
|
||
// When the operation starts, queue up a block to cause it to time out.
|
||
let when = dispatch_time(DISPATCH_TIME_NOW, Int64(timeout * Double(NSEC_PER_SEC)))
|
||
|
||
dispatch_after(when, dispatch_get_global_queue(QOS_CLASS_DEFAULT, 0)) {
|
||
/*
|
||
Cancel the operation if it hasn't finished and hasn't already
|
||
been cancelled.
|
||
*/
|
||
if !operation.finished && !operation.cancelled {
|
||
let error = NSError(code: .ExecutionFailed, userInfo: [
|
||
self.dynamicType.timeoutKey: self.timeout
|
||
])
|
||
|
||
operation.cancelWithError(error)
|
||
}
|
||
}
|
||
}
|
||
|
||
func operation(operation: Operation, didProduceOperation newOperation: NSOperation) {
|
||
// No op.
|
||
}
|
||
|
||
func operationDidFinish(operation: Operation, errors: [NSError]) {
|
||
// No op.
|
||
}
|
||
}
|