#ios #nsoperationqueue #nsoperation
#iOS #nsoperationqueue #nsoperation
Вопрос:
Я пытаюсь создать асинхронный подкласс операций. Код завершает работу при получении свойства «state». Я нашел статью, которая решает подкласс async, но мне любопытно, почему происходит сбой в очереди.sync { self._state } Вызываются willSet и didSet свойства _state, и элемент управления переходит в состояние получения, где происходит сбой изображения сбоя
class ConcurrentOperation: Operation {
private enum State: String {
case ready = "isReady"
case executing = "isExecuting"
case finished = "isFinished"
}
private var _state: State = .ready {
willSet {
willChangeValue(forKey: newValue.rawValue)
willChangeValue(forKey: _state.rawValue)
}
didSet {
didChangeValue(forKey: _state.rawValue)
didChangeValue(forKey: oldValue.rawValue)
}
}
private let queue = DispatchQueue(label: "com.concurrentOperation.chanakkya", attributes: .concurrent)
private var state: State {
get {
queue.sync { self._state }
}
set {
queue.sync(flags: .barrier) {
self._state = newValue
}
}
}
override var isReady: Bool {
super.isReady amp;amp; state == .ready
}
override var isExecuting: Bool {
state == .executing
}
override var isFinished: Bool {
state == .finished
}
override func start() {
guard !isCancelled else {
finish()
return
}
if !isExecuting {
state = .executing
}
main()
}
override func main() {
fatalError()
}
func finish() {
if isExecuting {
state = .finished
}
}
override func cancel() {
super.cancel()
finish()
}
}
Ответ №1:
Вы должны использовать временную переменную
private var state: State {
get {
var temp: State!
queue.sync {
temp = self._state
}
return temp
}
set {
queue.sync(flags: .barrier) {
self._state = newValue
}
}
}
Комментарии:
1. он по-прежнему выходит из строя. я думаю, что сбой может быть связан с жизненным циклом операции, вызовом KVO или чем-то еще