Комментарии 9
Здравствуйте, немного непонятно зачем для создания асинхронных операций добавлять потоконебезопасную переменную state. Не возможно ли создания гонки, когда мы будем записывать state
и
То есть получается картина, когда теоретически мы пытаемся изменять state из 2-х потоков. Мб в данном случае лучше использовать семафор, для AsyncOperation?
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?
0
Потокобезопасностью «родных» состояний операции управляет механизм KVO, и именно для обеспечения его правильной работы в «ручном» режиме мы «изобрели» «жизненно» важное перечисление state. Никакие семафоры здесь нам не помогут.
Кроме того, одна и та же операция не может быть запущена дважды на OperationQueue.
Кроме того, одна и та же операция не может быть запущена дважды на OperationQueue.
0
метод cancel () только устанавливает свойство isCancelled в true
У меня не так. Вот вставил assert() в ваш код который всегда срабатывает:
override func cancel() {
super.cancel()
assert(isCancelled)
0
Там ссылка 10-летней давности, когда был macOs Leopard, 10.5.
Сейчас 10.14.2 Mojave.
Для iPad написано прекрасное приложение WWDC с помощью OperationQueue.
Так что сейчас можно пользоваться, надежно.
Сейчас 10.14.2 Mojave.
Для iPad написано прекрасное приложение WWDC с помощью OperationQueue.
Так что сейчас можно пользоваться, надежно.
0
Да. да. Спасибо. Я сделал upd об этом внутри комментария.
Но причину того почему этот код фейлится:
(хотя судя по исходнику эпл не должен) — Я пока понять не могу.
Раньше `super.cancel()` делал ещё кое что — но этого уже давно нету…
Но причину того почему этот код фейлится:
override func cancel() {
super.cancel()
assert(super.isCancelled)
(хотя судя по исходнику эпл не должен) — Я пока понять не могу.
Раньше `super.cancel()` делал ещё кое что — но этого уже давно нету…
0
Дайте линк плиз на прекрасное приложение.
0
Смотрите видео WWDC 2015 developer.apple.com/videos/play/wwdc2015/226 «Advanced NSOperation» 8- ая минута и далее.
Ссылка на WWDC приложение на iPad — itunes.apple.com/ru/app/wwdc/id640199958?mt=8
Ссылка на WWDC приложение на iPad — itunes.apple.com/ru/app/wwdc/id640199958?mt=8
+1
Еще посмотрите это на YouTube
www.youtube.com/watch?v=M4n7u0txGDM
www.youtube.com/watch?v=M4n7u0txGDM
+1
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Concurrency в Swift 3 и 4. Operation и OperationQueue