Я пытаюсь начать с использования Operation
в стороннем проекте, а не на основе замкнутых обратных вызовов по всему моему сетевому коду, чтобы помочь устранить вложенные вызовы. Поэтому я немного прочел эту тему и наткнулся на эту реализацию:
open class AsynchronousOperation: Operation {
// MARK: - Properties
private let stateQueue = DispatchQueue(label: "asynchronous.operation.state", attributes: .concurrent)
private var rawState = OperationState.ready
private dynamic var state: OperationState {
get {
return stateQueue.sync(execute: {
rawState
})
}
set {
willChangeValue(forKey: "state")
stateQueue.sync(flags: .barrier, execute: {
rawState = newValue
})
didChangeValue(forKey: "state")
}
}
public final override var isReady: Bool {
return state == .ready && super.isReady
}
public final override var isExecuting: Bool {
return state == .executing
}
public final override var isFinished: Bool {
return state == .finished
}
public final override var isAsynchronous: Bool {
return true
}
// MARK: - NSObject
private dynamic class func keyPathsForValuesAffectingIsReady() -> Set<String> {
return ["state"]
}
private dynamic class func keyPathsForValuesAffectingIsExecuting() -> Set<String> {
return ["state"]
}
private dynamic class func keyPathsForValuesAffectingIsFinished() -> Set<String> {
return ["state"]
}
// MARK: - Foundation.Operation
public final override func start() {
super.start()
if isCancelled {
finish()
return
}
state = .executing
execute()
}
// MARK: - Public
/// Subclasses must implement this to perform their work and they must not call 'super'. The default implementation of this function throws an exception.
open func execute() {
fatalError("Subclasses must implement 'execute'.")
}
/// Call this function after any work is done or after a call to 'cancel()' to move the operation into a completed state.
public final func finish() {
state = .finished
}
}
@objc private enum OperationState: Int {
case ready
case executing
case finished
}
Есть некоторые детали реализации этого подкласса Operation
которые я хотел бы получить некоторую помощь в понимании.
-
Какова цель свойства
stateQueue
? Я вижу, что используетсяget
иset
изstate
вычислена собственности, но я не могу найти любую документацию, объясняющуюsync:flags:execute
иsync:execute
методы, которые они используют. -
Какова цель трех методов класса в разделе
NSObject
которые возвращают["state"]
? Я не вижу их где-либо использовать. Я нашел, вNSObject
,class func keyPathsForValuesAffectingValue(forKey key: String) → Set<String>
, но это не похоже, чтобы помочь мне понять, почему эти методы объявлены.