ReactiveX / RxSwift

Reactive Programming in Swift

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

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

⚠️ 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. ⚠️

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!