Cause of this SwiftData memory leak?

47 Views Asked by At

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?

0

There are 0 best solutions below