Сбой в очереди.синхронизация { self._state }

#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 или чем-то еще