drive's onNext closure should be main actor isolated
BrentMifsud opened this issue · comments
Short description of the issue:
With Swift 6 beta coming in June, and its full release in the fall, RxSwift should start offering better compliance with the new Swift 6 compiler changes.
One area of note here are Drivers. Which are supposed to guarantee main thread operation.
I propose that the method signature for drive
be updated to take a main actor closure.
Expected outcome:
When using a driver, I should be able to read/write main actor isolated state.
What actually happens:
Call to main actor-isolated instance method 'myMainActorProperty' in a synchronous nonisolated context
Self contained code example that reproduces the issue:
class MyClass {
@MainActor private var mutableState: String
private var disposeBag = DisposeBag
func updateMutableStateWithDriver(to newValue: String) {
Observable.just(newValue)
.asDriver(onErrorJustReturn: "Failed")
.drive(with: self) { this, newValue in
this.mutableState = newValue // Call to main actor-isolated instance method 'mutableState' in a synchronous nonisolated context
}
.disposed(by: disposeBag)
}
}
RxSwift/RxCocoa/RxBlocking/RxTest version/commit
6.6.0
Platform/Environment
- iOS
- macOS
- tvOS
- watchOS
- playgrounds
How easy is to reproduce? (chances of successful reproduce after running the self contained code)
- easy, 100% repro
- sometimes, 10%-100%
- hard, 2% - 10%
- extremely hard, %0 - 2%
Xcode version:
15.3
Installation method:
- CocoaPods
- Carthage
- Git submodules
- Swift Package Manager
I have multiple versions of Xcode installed:
(so we can know if this is a potential cause of your issue)
- yes (which ones)
- no
Level of RxSwift knowledge:
(this is so we can understand your level of knowledge
and formulate the response in an appropriate manner)
- just starting
- I have a small code base
- I have a significant code base
Hey there, thanks for the report!
I'm planning and hopeful to have some time to do a sweep with Complete Concurrency Checking to prepare for Swift 6.0. Happy to take any PRs around this if anyone's interested in tackling!