Profiling with Xcode Leaks reveals a leak in the following code where I am trying to asynchronously fetch an array of Cat objects from SwiftData:
class SomeViewModel: ObservableObject {
var modelContainer: ModelContainer
var cats = [Cats]()
func prepareCats() {
Task.detached {
//memory leak detected in the following line (or two)
let bgActor = CatManager.BackgroundActor(modelContainer: self.modelContainer)
if let cats = try await bgActor.fetchCatsFrom(vet: vet) {
self.cats = cats
}
}
}
}
class CatManager {
static let shared: CatManager = CatManager()
private init() {}
@ModelActor
actor BackgroundActor {
func fetchCatsFrom(vet: Vet) async throws -> [Cat]? {
var vetFetchDescriptor = FetchDescriptor<Vet>()
let vetId = vet.id
vetFetchDescriptor.predicate = #Predicate<Vet> { $0.id == vetId }
guard let vet = try modelContext.fetch(vetFetchDescriptor).first else {
print("vet not found")
return nil
}
let filteredCats = vet.cats.filter { !$0.homed }
return filteredCats
}
}
}
Can you tell me what I'm doing wrong here and how to resolve the memory leak?