ReactiveX / RxSwift

Reactive Programming in Swift
MIT License
24.41k stars 4.17k forks source link

drive's onNext closure should be main actor isolated #2586

Open BrentMifsud opened 8 months ago

BrentMifsud commented 8 months ago

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

How easy is to reproduce? (chances of successful reproduce after running the self contained code)

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:

I have multiple versions of Xcode installed: (so we can know if this is a potential cause of your issue)

Level of RxSwift knowledge: (this is so we can understand your level of knowledge and formulate the response in an appropriate manner)

freak4pc commented 8 months ago

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!