I have some code which handles doing some computation on a background thread before updating Core Data NSManagedObjects by using the NSManagedObjectContext.perform functions.
This code is covered in Sendable warnings in Xcode 26 (beta 6) because my NSManagedObject subclasses (autogenerated) are non-Sendable and NSManagedObjectContext.perform function takes a Sendable closure.
But I can't really figure out what I should be doing. I realize this pattern is non-ideal for Swift concurrency, but it's what Core Data demands AFAIK. How do I deal with this?
let moc = object.managedObjectContext!
try await moc.perform {
    object.completed = true // Capture of 'object' with non-Sendable type 'MySpecialObject' in a '@Sendable' closure
    try moc.save()
}
Thanks in advance for your help!
                    
                  
                Concurrency
RSS for tagConcurrency is the notion of multiple things happening at the same time.
Posts under Concurrency tag
            
              
                133 Posts
              
            
            
              
                
              
            
          
          
  
    
    Selecting any option will automatically load the page
  
  
  
  
    
  
  
              Post
Replies
Boosts
Views
Activity
                    
                      I'm working with SwiftData and SwiftUI and it's not clear to me if it is good practice to have a @ModelActor directly populate a SwiftUI view. For example when having to combine manual lab results and clinial results from HealthKit. The Clinical lab results are an async operation:
@ModelActor
actor LabResultsManager {
    
    func fetchLabResultsWithHealthKit() async throws -> [LabResultDto] {
        let manualEntries = try modelContext.fetch(FetchDescriptor<LabResult>())
        let clinicalLabs = (try? await HealthKitService.getLabResults()) ?? []
        
        return (manualEntries + clinicalLabs).sorted {
            $0.date > $1.date
        }.map {
            return LabResultDto(from: $0)
         }
    }
}
struct ContentView: View {
    @State private var labResults: [LabResultDto] = []
    
    var body: some View {
        List(labResults, id: \.id) { result in
            VStack(alignment: .leading) {
                Text(result.testName)
                Text(result.date, style: .date)
            }
        }
        .task {
            do {
                let labManager = LabResultsManager()
                labResults = try await labManager.fetchLabResultsWithHealthKit()
            } catch {
                // Handle error
            }
        }
    }
}
EDIT:
I have a few views that would want to use these labResults so I need an implementation that can be reused. Having to fetch and combine in each view will not be good practice. Can I pass a modelContext to a viewModel?
                    
                  
                
                    
                      I have a TVTopShelfContentProvider that implements 
func loadTopShelfContent() async -> (any TVTopShelfContent)?
When running on Xcode 26 b5 I am seeing the following error in swift 6 mode.
Non-Sendable type '(any TVTopShelfContent)?' cannot be returned from nonisolated override to caller of superclass instance method 'loadTopShelfContent()'
I'm not sure exactly what's changed here as it used to compile just fine but it's unclear now how I can work-around this error or how the API is supposed to be used.
The following definition is enough to trigger the error in Swift 6 language mode.
import TVServices
class ContentProvider: TVTopShelfContentProvider {
  override func loadTopShelfContent() async -> (any TVTopShelfContent)? {
    return nil
  }
}
I can "fix" it by adding @preconcurrency to the TVServices import but it seems like this API is unusable currently? Or maybe it's user error on my part?
                    
                  
                
                    
                      I'm struggling to convert Swift 5 to Swift 6.
As advised in doc, I first turned strict concurrency ON. I got no error.
Then, selected swift6… and problems pop up.
I have a UIViewController with
IBOutlets: eg a TextField.
computed var eg duree
func using UNNotification: func userNotificationCenter
I get the following error in the declaration line of the func userNotificationCenter:
Main actor-isolated instance method 'userNotificationCenter(_:didReceive:withCompletionHandler:)' cannot be used to satisfy nonisolated requirement from protocol 'UNUserNotificationCenterDelegate'
So, I declared the func as non isolated.
This func calls another func func2, which I had also to declare non isolated.
Then I get error on the computed var used in func2
Main actor-isolated property 'duree' can not be referenced from a nonisolated context
So I declared duree as nonsilated(unsafe).
Now comes the tricky part.
The computed var references the IBOutlet dureeField
if dureeField.text == "X"
leading to the error
Main actor-isolated property 'dureeField' can not be referenced from a nonisolated context
So I finally declared the class as mainActor and the textField as nonisolated
    @IBOutlet nonisolated(unsafe) weak var dureeField  : UITextField!  
That silences the error (but declaring unsafe means I get no extra robustness with swift6) just to create a new one when calling dureeField.text:
Main actor-isolated property 'text' can not be referenced from a nonisolated context
Question: how to address properties inside IBOutlets ? I do not see how to declare them non isolated and having to do it on each property of each IBOutlet would be impracticable.
The following did work, but will make code very verbose:
if  MainActor.assumeIsolated({dureeField.text == "X"}) {
So I must be missing something.
                    
                  
                
                    
                      When attempting to compile an existing project with Swift 6, default isolation set to MainActor and approachable concurrency enabled, all awakeFromNib functions lead to the following compile error:
"Main actor-isolated instance method 'awakeFromNib()' has different actor isolation from nonisolated overridden declaration"
I've seen articles before approachable concurrency stating that one remedy is to wrap code within the function with MainActor.assumeIsolated{ }. However, that no longer addresses the error.
One combination of changes that removes the error is doing the following:
nonisolated override func awakeFromNib() {
    super.awakeFromNib()
    MainActor.assumeIsolated {
        ...
    }
}
Honestly, that's a mess. Long term, we are looking to remove all these functions, but does anyone have a better solution?
                    
                  
                
                    
                      I'm running into a weird SwiftUI concurrency issue that only seems to happen on a real device (iOS 18.5 in my case), and not in simulator.  I have a NavigationSplitView where the Detail view uses .task(id:_:) to perform some async work upon appearance (in my real-world case, a map snapshot).  When running this on a real device, the first execution of the task works as expected.  However, any task subsequent executions, even ones for the same id, always start in the Task.isCancelled state.
Is there something about .task(id:_:) that I'm misunderstanding, or have I stumbled upon a serious bug here?
import SwiftUI
struct ContentView: View {
    var body: some View {
        TaskBugSplitView()
    }
}
struct TestItem: Identifiable, Hashable {
    var id: Int
    var name: String
}
struct TaskBugSplitView: View {
    @State
    private var selectedItemIndex: [TestItem].Index?
    
    @State
    private var testItems: [TestItem] = [
        TestItem(id: 1, name: "First Item"),
        TestItem(id: 2, name: "Second Item"),
        TestItem(id: 3, name: "Third Item"),
        TestItem(id: 4, name: "Fourth Item"),
        TestItem(id: 5, name: "Fifth Item")
    ]
    
    var body: some View {
        NavigationSplitView {
            List(testItems.indices, id: \.self, selection: $selectedItemIndex) { item in
                Text(testItems[item].name)
            }
        } detail: {
            if let selectedItemIndex {
                TaskBugDetailView(item: testItems[selectedItemIndex])
            } else {
                Text("Select an item")
                    .foregroundStyle(.secondary)
            }
        }
    }
}
struct TaskBugDetailView: View {
    @State var item: TestItem
    @State private var taskResult = "Not started"
    
    var body: some View {
        VStack(spacing: 20) {
            Text("Item: \(item.name)")
                .font(.title2)
            
            Text("Task Result:")
                .font(.headline)
            
            Text(taskResult)
                .foregroundStyle(taskResult.contains("CANCELLED") ? .red : .primary)
            
            Spacer()
        }
        .padding()
        .navigationTitle(item.name)
        .task(id: item.id) {
            
            // BUG: On real devices, Task.isCancelled is true immediately for all tasks
            // after the first successful one, even though the ID has changed
            
            if Task.isCancelled {
                taskResult = "CANCELLED at start"
                print("Task cancelled at start for item \(item.id)")
                return
            }
            
            taskResult = "SUCCESS"
            print("Task completed successfully for item \(item.id)")
        }
    }
}
                    
                  
                
                    
                      AVAudioFormat has no Swift concurrency annotations but the documentation states "Instances of this class are immutable."
This made me always assume it was safe to pass AVAudioFormat instances around. Is this the case? If so can it be marked as Sendable? Am I missing something?
                    
                  
                
                    
                      Hi!
I configure proxy for webview like
DispatchQueue.main.async {
    self.webView.configuration.websiteDataStore.proxyConfigurations = [proxyConfiguration] 
}
It is fine in iosiOS 17 however, it crashes in iOS 18.3. And the problem seems to be related to the left side of the equation. I tried to call
print(self.webView.configuration.websiteDataStore.proxyConfigurations.count) 
in async block and got the same bad access error. But if stop at that line of code and call
po self.webView.configuration.websiteDataStore.proxyConfigurations 
in debugger it returns 0 elements.
Did anyone have the same problem? What may cause the exception?
                    
                  
                
                    
                      Every time macOS goes to sleep the processes get suspended which is expected. But during the sleep period, all processes keep coming back and they all get a small execution window where they make some n/w requests. Regardless of what power settings i have. It also does not matter whether my app is a daemon or not
Is there any way that i can disable this so that when system is in sleep, it stays in suspended, no intermittent execution window? I have tried disabling Wake for network access setting but processes still keep getting intermittent execution window.
Is there any way that i can prevent my app from coming back while in sleep. I don't want my app to get execution window, perform some executions and then get suspended not knowing when it will get execution window again?
                    
                  
                
                    
                      In my Xcode app, I was attempting to use the #Playground macro to play around with some of the Foundation Model features to see if they would work for my iOS app. However, every time I used a #Playground macro, even if it was empty, it would receive the following error:
/var/folders/q2/x5b9x0y161bb2l_0yj1_j6wm0000gn/T/swift-generated-sources/@__swiftmacro_20PlaygroundMacroIssue0022ContentViewswift_tiAIefMX26_0_33_B691877350F20F2DFC040B9E585F4D10Ll0A0fMf_.swift:51:5 Main actor-isolated let '$s20PlaygroundMacroIssue0022ContentViewswift_tiAIefMX26_0_33_B691877350F20F2DFC040B9E585F4D10Ll0A0fMf_23PlaygroundContentRecordfMu_' can not be referenced from a nonisolated context
Here are my Xcode and system versions:
Mac is running the first public beta of Tahoe.
iOS Simulator is running 26.0 dev beta 4.
Xcode is Xcode 26 beta 4.
So, I went to try to reproduce the error in a blank iOS app project (the error above is the one that I reproduced in that project). Here are the steps that I took.
I created a new iOS project in Xcode 26.
I went into the ContentView.swift that was created for me and imported the Playgrounds module and created a blank #Playground at the bottom of the file.
I then compiled the project and it ran just fine.
To try to find out what the issue was, I looked at the concurrency settings. In my real app, Strict Concurrency Checking was set to Complete but was Minimal in my test project. So I went and changed that setting in my real app and it didn't fix anything.
Next, I looked at the Swift Version, which turned out to be the culprit. My test app was running Swift 5 whereas the real app was running Swift 6. It seems to have crashed while running Swift 6, not 5.
I have trouble understanding what the error is saying. I have tried using the Code Intelligence feature to fix the bug but it hasn't helped.
Has anyone here experienced a similar bug? Is there something I can do to fix it or is this an error in Xcode that should be reported?
I have attached an iCloud link to my test project if anybody wants to see if they can reproduce the issue: here
Thanks!
                    
                  
                
                    
                      Hello,
We have been encountering a persistent crash in our application, which is deployed exclusively on iPad devices. The crash occurs in the following code block:
        let requestHandler = ImageRequestHandler(paddedImage)
        var request = CoreMLRequest(model: model)
        request.cropAndScaleAction = .scaleToFit
        let results = try await requestHandler.perform(request)
The client using this code is wrapped inside an actor, following Swift concurrency principles.
The issue has been consistently reproduced across multiple iPadOS versions, including:
iPad OS - 18.4.0
iPad OS - 18.4.1
iPad OS - 18.5.0
This is the crash log -
          Crashed: com.apple.VN.detectorSyncTasksQueue.VNCoreMLTransformer
0  libobjc.A.dylib                0x7b98 objc_retain + 16
1  libobjc.A.dylib                0x7b98 objc_retain_x0 + 16
2  libobjc.A.dylib                0xbf18 objc_getProperty + 100
3  Vision                         0x326300 -[VNCoreMLModel predictWithCVPixelBuffer:options:error:] + 148
4  Vision                         0x3273b0 -[VNCoreMLTransformer processRegionOfInterest:croppedPixelBuffer:options:qosClass:warningRecorder:error:progressHandler:] + 748
5  Vision                         0x2ccdcc __119-[VNDetector internalProcessUsingQualityOfServiceClass:options:regionOfInterest:warningRecorder:error:progressHandler:]_block_invoke_5 + 132
6  Vision                         0x14600 VNExecuteBlock + 80
7  Vision                         0x14580 __76+[VNDetector runSuccessReportingBlockSynchronously:detector:qosClass:error:]_block_invoke + 56
8  libdispatch.dylib              0x6c98 _dispatch_block_sync_invoke + 240
9  libdispatch.dylib              0x1b584 _dispatch_client_callout + 16
10 libdispatch.dylib              0x11728 _dispatch_lane_barrier_sync_invoke_and_complete + 56
11 libdispatch.dylib              0x7fac _dispatch_sync_block_with_privdata + 452
12 Vision                         0x14110 -[VNControlledCapacityTasksQueue dispatchSyncByPreservingQueueCapacity:] + 60
13 Vision                         0x13ffc +[VNDetector runSuccessReportingBlockSynchronously:detector:qosClass:error:] + 324
14 Vision                         0x2ccc80 __119-[VNDetector internalProcessUsingQualityOfServiceClass:options:regionOfInterest:warningRecorder:error:progressHandler:]_block_invoke_4 + 336
15 Vision                         0x14600 VNExecuteBlock + 80
16 Vision                         0x2cc98c __119-[VNDetector internalProcessUsingQualityOfServiceClass:options:regionOfInterest:warningRecorder:error:progressHandler:]_block_invoke_3 + 256
17 libdispatch.dylib              0x1b584 _dispatch_client_callout + 16
18 libdispatch.dylib              0x6ab0 _dispatch_block_invoke_direct + 284
19 Vision                         0x2cc454 -[VNDetector internalProcessUsingQualityOfServiceClass:options:regionOfInterest:warningRecorder:error:progressHandler:] + 632
20 Vision                         0x2cd14c __111-[VNDetector processUsingQualityOfServiceClass:options:regionOfInterest:warningRecorder:error:progressHandler:]_block_invoke + 124
21 Vision                         0x14600 VNExecuteBlock + 80
22 Vision                         0x2ccfbc -[VNDetector processUsingQualityOfServiceClass:options:regionOfInterest:warningRecorder:error:progressHandler:] + 340
23 Vision                         0x125410 __swift_memcpy112_8 + 4852
24 libswift_Concurrency.dylib     0x5c134 swift::runJobInEstablishedExecutorContext(swift::Job*) + 292
25 libswift_Concurrency.dylib     0x5d5c8 swift_job_runImpl(swift::Job*, swift::SerialExecutorRef) + 156
26 libdispatch.dylib              0x13db0 _dispatch_root_queue_drain + 364
27 libdispatch.dylib              0x1454c _dispatch_worker_thread2 + 156
28 libsystem_pthread.dylib        0x9d0 _pthread_wqthread + 232
29 libsystem_pthread.dylib        0xaac start_wqthread + 8
We found an issue similar to us - https://developer.apple.com/forums/thread/770771.
But the crash logs are quite different, we believe this warrants further investigation to better understand the root cause and potential mitigation strategies.
Please let us know if any additional information would help diagnose this issue.
                    
                  
                
                    
                      I'm having trouble dealing with concurrency with the SFAuthorizationPluginView.  Does anybody know how this can be solved?
https://developer.apple.com/documentation/securityinterface/sfauthorizationpluginview
The crux of it is:
If I inherit an object as part of an API, and the API is preconcurrency, and thus is nonisolated (but in reality is @MainActor), how do I return a @MainActor GUI element?
https://developer.apple.com/documentation/securityinterface/sfauthorizationpluginview/firstresponder()
The longer story:
I made my view class inherit SFAuthorizationPluginView.
The API is preconcurrency (but not marked as preconcurrency)
I started using concurrency in my plugin to retrieve data over XPC.  (https://developer.apple.com/documentation/xpc/xpcsession + https://developer.apple.com/documentation/swift/withcheckedthrowingcontinuation(isolation:function:_:))
Once I retrieve the data over XPC, I need to post it on GUI, hence I've set my view class as @MainActor in order to do the thread switch.
Swift compiler keeps complaining:
    override func firstResponder() -> NSResponder? {
        return usernameField
    }    
"Main actor-isolated property 'usernameField' can not be referenced from a nonisolated context; this is an error in the Swift 6 language mode"
    override func firstResponder() -> NSResponder? {
        MainActor.assumeIsolated {
            return usernameField
        }
    }
"Sending 'self' risks causing data races; this is an error in the Swift 6 language mode"
I think fundamentally, the API is forcing me to give away a @MainActor variable through a nonisolated function, and there is no way to shut up the compiler.
I've tried @preconcurrency and it has no effect as far as I can tell.  I've also tried marking the function explicitly as nonisolated.
The rest of the API are less problematic, but returning a GUI variable is exceptionally difficult.
                    
                  
                
                    
                      AsyncStream { continuation in
  Task {
    let response = await getResponse()
    continuation.yield(response)
    continuation.finish()
  }
}
In this WWDC video https://developer.apple.com/videos/play/wwdc2025/231/ at 8:20 the presenter mentions that if the "Task gets cancelled, the Task inside the function will automatically get cancelled too". The documentation does not mention anything like this.
From my own testing on iOS 18.5, this is not true.
                    
                  
                
                    
                      I'm encountering a crash on app launch. The crash is observed in iOS version 17.6 but not in iOS version 18.5. The only new notable thing I added to this app version was migrate to store kit 2.
Below is the error message from Xcode:
  Referenced from: <DCC68597-D1F6-32AA-8635-FB975BD853FE> /private/var/containers/Bundle/Application/6FB3DDE4-6AD5-4778-AD8A-896F99E744E8/callbreak.app/callbreak
  Expected in:     <A0C8B407-0ABF-3C28-A54C-FE8B1D3FA7AC> /usr/lib/swift/libswift_Concurrency.dylib
Symbol not found: _$sScIsE4next9isolation7ElementQzSgScA_pSgYi_tYa7FailureQzYKFTu
  Referenced from: <DCC68597-D1F6-32AA-8635-FB975BD853FE> /private/var/containers/Bundle/Application/6FB3DDE4-6AD5-4778-AD8A-896F99E744E8/callbreak.app/callbreak
  Expected in:     <A0C8B407-0ABF-3C28-A54C-FE8B1D3FA7AC> /usr/lib/swift/libswift_Concurrency.dylib
dyld config: DYLD_LIBRARY_PATH=/usr/lib/system/introspection DYLD_INSERT_LIBRARIES=/usr/lib/libLogRedirect.dylib:/usr/lib/libBacktraceRecording.dylib:/usr/lib/libMainThreadChecker.dylib:/usr/lib/libRPAC.dylib:/System/Library/PrivateFrameworks/GPUToolsCapture.framework/GPUToolsCapture:/usr/lib/libViewDebuggerSupport.dylib```
and Stack Trace:
```* thread #1, stop reason = signal SIGABRT
  * frame #0: 0x00000001c73716f8 dyld`__abort_with_payload + 8
    frame #1: 0x00000001c737ce34 dyld`abort_with_payload_wrapper_internal + 104
    frame #2: 0x00000001c737ce68 dyld`abort_with_payload + 16
    frame #3: 0x00000001c7309dd4 dyld`dyld4::halt(char const*, dyld4::StructuredError const*) + 304
    frame #4: 0x00000001c73176a8 dyld`dyld4::prepare(...) + 4088
    frame #5: 0x00000001c733bef4 dyld`start + 1748```
Note: My app is a Godot App and uses objc static libraries. I am using swift with bridging headers for interoperability. This issue wasn't observed until my last version in which the migration to storekit2 was the only notable change.
                    
                  
                
                    
                      Hi,
I am experiencing main thread freezes from fetching on Main Actor. Attempting to move the function to a background thread, but whenever I reference the TestModel in a nonisolated context or in another model actor, I get this warning:
Main actor-isolated conformance of 'TestModel' to 'PersistentModel' cannot be used in actor-isolated context; this is an error in the Swift 6 language mode
Is there a way to do this correctly?
Recreation, warning on line 13:
class TestModel {
    var property: Bool = true
    init() {}
}
struct SendableTestModel: Sendable {
    let property: Bool
}
@ModelActor
actor BackgroundActor {
    func fetch() throws -> [SendableTestModel] {
        try modelContext.fetch(FetchDescriptor<TestModel>()).map { SendableTestModel(property: $0.property) }
    }
}
                    
                  
                
                    
                      We use several UIKit and AVFoundation APIs in our project, including:
setAlternateIconName(_:completionHandler:)
getAllTasks(completionHandler:)
loadMediaSelectionGroup(for:completionHandler:)
Moreover, we use the Swift Concurrency versions for these APIs:
@MainActor
func setAlternateIconName(_ alternateIconName: String?) async throws
var allTasks: [URLSessionTask] { get async }
func loadMediaSelectionGroup(for mediaCharacteristic: AVMediaCharacteristic) async throws -> AVMediaSelectionGroup?
Everything worked well with these APIs in Xcode 16.2 and earlier, but starting from Xcode 16.3 (and in 16.4), they cause crashes. We've rewritten the APIs to use completion blocks instead of async/await, and this approach works.
Stack traces:
setAlternateIconName(_:completionHandler:)
var allTasks: [URLSessionTask] { get async }
loadMediaSelectionGroup(for:completionHandler:)
Also, I attached some screenshots from Xcode 16.4.
                    
                  
                
                    
                      This is not a question but more of a hint where I was having trouble with. In my SwiftData App I wanted to move from Swift 5 to Swift 6, for that, as recommended, I stayed in Swift 5 language mode and set 'Strict Concurrency Checking' to 'Complete' within my build settings.
It marked all the places where I was using predicates with the following warning:
Type '' does not conform to the 'Sendable' protocol; this is an error in the Swift 6 language mode
I had the same warnings for SortDescriptors.
I spend quite some time searching the web and wrapping my head around how to solve that issue to be able to move to Swift 6. In the end I found this existing issue in the repository of the Swift Language https://github.com/swiftlang/swift/issues/68943. It says that this is not a warning that should be seen by the developer and in fact when turning Swift 6 language mode on those issues are not marked as errors.
So if anyone is encountering this when trying to fix all issues while staying in Swift 5 language mode, ignore those, fix the other issues and turn on Swift 6 language mode and hopefully they are gone.
                    
                  
                
                    
                      My experience with Swift 6 strict concurrency so far doesn't match my understanding of implicit MainActor isolation semantics.
This is a cross-post from StackOverflow. I will link answers between both forums.
TL;DR
Build succeeds when testing a struct declared in the test module, but fails when the struct is moved to the main module:
Main actor-isolated property … cannot be accessed from outside the actor.
Steps to reproduce
Open up Xcode 26 beta 2 on macOS 26 (probably also ok on current stables).
Create a new Swift app with Swift testing, no storage. Call it WhatTheSwift.
Set the Swift Language Version on all three targets to Swift 6.
Update the default test file to be this:
import Testing
@testable import WhatTheSwift
struct WhatTheSwiftTests {
    @Test func example() async throws {
        let thing = Thing(foo: "bar")
        #expect(thing.foo == "bar")
    }
}
struct Thing {
    let foo: String
}
That should build fine, and the tests should pass.
Now, move the Thing declaration into its own Thing.swift file in the WhatTheSwift module, and try running the test again. You should see this:
Observations
Marking the test @MainActor allows the test to pass, suggesting the compiler actually wants to isolate Thing.foo to the main actor.
My question
Why? And why only when Thing is in a different module?
                    
                  
                
                    
                      I've turned on Swift 6 language mode and noticed that during runtime Xcode gives this warning for a new widget (iOS 17.2):
warning: data race detected: @MainActor function at TestWidgetExtension/TestWidget.swift:240 was not called on the main thread
struct TestWidget: Widget {
  let kind: String = "TestWidget"
  
  var body: some WidgetConfiguration {
    AppIntentConfiguration(
      kind: kind,
      intent: ConfigurationAppIntent.self,
      provider: Provider()
    ) { entry in // LINE 240
      TestWidgetEntryView(entry: entry)
        .containerBackground(Color.white, for: .widget)
    }
  }
}
Is there any way to solve this on my side?
Thank you!
                    
                  
                
                    
                      Hello, I'm trying to subscribe to AVPlayerItem status updates using Combine and it's bridge to Swift Concurrency – .values.
This is my sample code.
struct ContentView: View {
    @State var player: AVPlayer?
    @State var loaded = false
    var body: some View {
        VStack {
            if let player {
                Text("loading status: \(loaded)")
                Spacer()
                VideoPlayer(player: player)
                Button("Load") {
                    Task {
                        let item = AVPlayerItem(
                            url: URL(string: "https://sample-videos.com/video321/mp4/360/big_buck_bunny_360p_5mb.mp4")!
                        )
                        player.replaceCurrentItem(with: item)
                        let publisher = player.publisher(for: \.status)
                        for await status in publisher.values {
                            print(status.rawValue)
                            if status == .readyToPlay {
                                loaded = true
                                break
                            }
                        }
                        print("we are out")
                    }
                }
            }
            else {
                Text("No video selected")
            }
        }
        .task {
            player = AVPlayer()
        }
    }
}
After I click on the "load" button it prints out 0 (as the initial status of .unknown) and nothing after – even when the video is fully loaded.
At the same time this works as expected (loading status is set to true):
struct ContentView: View {
    @State var player: AVPlayer?
    @State var loaded = false
    @State var cancellable: AnyCancellable?
    var body: some View {
        VStack {
            if let player {
                Text("loading status: \(loaded)")
                Spacer()
                VideoPlayer(player: player)
                Button("Load") {
                    Task {
                        let item = AVPlayerItem(
                            url: URL(string: "https://sample-videos.com/video321/mp4/360/big_buck_bunny_360p_5mb.mp4")!
                        )
                        player.replaceCurrentItem(with: item)
                        let stream = AsyncStream { continuation in
                            cancellable = item.publisher(for: \.status)
                                .sink {
                                    if $0 == .readyToPlay {
                                        continuation.yield($0)
                                        continuation.finish()
                                    }
                                }
                        }
                        for await _ in stream {
                            loaded = true
                            cancellable?.cancel()
                            cancellable = nil
                            break
                        }
                    }
                }
            }
            else {
                Text("No video selected")
            }
        }
        .task {
            player = AVPlayer()
        }
    }
}
Is this a bug or something?