RxSwift icon indicating copy to clipboard operation
RxSwift copied to clipboard

drive's onNext closure should be main actor isolated

Open BrentMifsud opened this issue 3 months ago • 1 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

  • [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

BrentMifsud avatar Mar 25 '24 21:03 BrentMifsud

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!

freak4pc avatar Mar 25 '24 21:03 freak4pc