私は非同期操作をサポートするためにOperation
をサブクラス化しました。 新しいクラスはAsyncOperation
と呼ばれ、state
という新しいフィールドが追加されました。これはenum
であり、操作状態の管理に役立ちます。オペレーション状態スレッドセーフではない
class AsyncOperation: Operation {
// DONE: State enum with keyPath property
enum State: String {
case Ready, Executing, Finished
fileprivate var keyPath: String {
return "is" + rawValue
}
}
// DONE: state property
var state = State.Ready {
willSet {
willChangeValue(forKey: newValue.keyPath)
willChangeValue(forKey: state.keyPath)
}
didSet {
didChangeValue(forKey: oldValue.keyPath)
didChangeValue(forKey: state.keyPath)
}
}
}
extension AsyncOperation {
// DONE: Operation Overrides
override var isReady: Bool {
return super.isReady && state == .Ready
}
override var isExecuting: Bool {
return state == .Executing
}
override var isFinished: Bool {
return state == .Finished
}
override var isAsynchronous: Bool {
return true
}
override func start() {
if isCancelled {
state = .Finished
return
}
main()
state = .Executing
}
override func cancel() {
state = .Finished
}
}
一般に、このサブクラスは大きく動作し、非常に満足しています。タフないくつかの奇妙な行動を経験 イム... いくつかのケースでは、IMはそうのようなキューに操作を追加:私はブレークポイントをチェックした場合の動作は何とかすでに、キューに派遣しているため
//this code happens in mainViewController
//op is an operation that belong to mainViewController and could dispatched to the queue from many places, its init called once in view did load.
op = SomeAsyncOperation()
if(op.state == .Executing){
queue.addOperatiom(op)
}
とアプリがクラッシュします私が作成したstate
プロパティはReady
であり、生の操作のisExecuting
フィールドはtrue
です。私のstate
プロパティが発生し、操作状態フィールドが同期されません。別の実装でstate
フィールドを確認すると、Executing
とFinished
になります。どのようにすればそれらを常に同期させることができますか?