RxSwift
RxSwift copied to clipboard
drive's onNext closure should be main actor isolated
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
- [x] iOS
- [x] macOS
- [x] tvOS
- [x] watchOS
- [x] playgrounds
How easy is to reproduce? (chances of successful reproduce after running the self contained code)
- [x] easy, 100% repro
- [ ] sometimes, 10%-100%
- [ ] hard, 2% - 10%
- [ ] extremely hard, %0 - 2%
Xcode version:
15.3
:warning: Fields below are optional for general issues or in case those questions aren't related to your issue, but filling them out will increase the chances of getting your issue resolved. :warning:
Installation method:
- [ ] CocoaPods
- [ ] Carthage
- [ ] Git submodules
- [x] 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)
- [x] 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
- [x] 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!