Hi,
when using URL session nested in a few async/await calls I get a crash in swift_getObjectType (sometimes in processDefaultActor). Any ideas what could be causing this or hints how to debug/where to look?
For a (contrived - because it was extracted from a larger project) example please see below (see "crashes here" comment for the last call before the crash).
Thanks for any hints in advance! Cheers, Michael
// Crash on: Xcode Version 13.0 beta (13A5155e), macOS 11.4 (20F71), on iPhone Simulator
import CoreData
import SwiftUI
struct ContentView: View {
@StateObject var dataCoordinator: DataCoordinator = .init()
var body: some View {
Button {
print("GO")
async {
try await dataCoordinator.api.getSomething()
}
} label: {
Label("Go", systemImage: "figure.walk")
}
.buttonStyle(.bordered)
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView().environment(\.managedObjectContext, PersistenceController.preview.container.viewContext)
}
}
// MARK: - Test coding -
class DataCoordinator: ObservableObject {
let api: API = .init()
func refreshSomething() async throws {
try await api.getSomething()
}
}
// MARK: -
class API {
var session: URLSession = .init(configuration: .ephemeral)
func getSomething() async throws {
let url = URL(string: "https://www.heise.de")!
let request = URLRequest(url: url)
let (data, response) = try await _failsafe(request: request)
print("\(response)")
}
private func _failsafe(request: URLRequest) async throws -> (Data, URLResponse) {
do {
var (data, response) = try await session.data(for: request)
let httpResponse = response as! HTTPURLResponse
var recovered = false
if httpResponse.allHeaderFields["dsfsfsdsfds"] == nil {
let login = LoginAsync()
await login.login(session: session)
recovered = true
}
if recovered {
let req2 = URLRequest(url: URL(string: "https://www.heise.de")!)
print("right before crash")
try await session.data(for: req2) // crashes here with EXC_BAD_ACCESS
print("right after crash ;-)")
}
return (data, response)
} catch {
print("\(error)")
throw error
}
}
}
// MARK: -
actor LoginAsync {
func login(session: URLSession) async {
let url = URL(string: "https://www.google.com")!
let request = URLRequest(url: url)
do {
let (data, response) = try await session.data(for: request)
} catch {
print("\(error)")
}
}
}