Pull to refresh

Comments 9

Здравствуйте, немного непонятно зачем для создания асинхронных операций добавлять потоконебезопасную переменную state. Не возможно ли создания гонки, когда мы будем записывать state
    override func start() {
        
        if isCancelled {
            state = .finished
            return
        }
        
        main()
        state = .executing
        
    }


и
    override func main() {
        
        asyncAdd(lhs: lhs, rhs: rhs) { result in
            
            self.result = result
            self.state = .finished
            
        }
        
    }


То есть получается картина, когда теоретически мы пытаемся изменять state из 2-х потоков. Мб в данном случае лучше использовать семафор, для AsyncOperation?
Потокобезопасностью «родных» состояний операции управляет механизм KVO, и именно для обеспечения его правильной работы в «ручном» режиме мы «изобрели» «жизненно» важное перечисление state. Никакие семафоры здесь нам не помогут.
Кроме того, одна и та же операция не может быть запущена дважды на OperationQueue.
метод cancel () только устанавливает свойство isCancelled в true

У меня не так. Вот вставил assert() в ваш код который всегда срабатывает:
    override func cancel() {
        super.cancel()
        assert(isCancelled)
Там ссылка 10-летней давности, когда был macOs Leopard, 10.5.
Сейчас 10.14.2 Mojave.
Для iPad написано прекрасное приложение WWDC с помощью OperationQueue.
Так что сейчас можно пользоваться, надежно.
Да. да. Спасибо. Я сделал upd об этом внутри комментария.

Но причину того почему этот код фейлится:
    override func cancel() {
        super.cancel()
        assert(super.isCancelled)

(хотя судя по исходнику эпл не должен) — Я пока понять не могу.
Раньше `super.cancel()` делал ещё кое что — но этого уже давно нету…
Sign up to leave a comment.

Articles