CoreData fetch - утечки памяти - PullRequest
       20

CoreData fetch - утечки памяти

0 голосов
/ 03 августа 2020

Когда я пытаюсь поймать данные из CoreData, я получаю утечку памяти.

Моя функция для выборки:

func fetchTableBodyData<T: TableBody, C: NSManagedObject>(from year: Int?, coreDataObject: C.Type, returnType: T.Type) -> [T] {
    guard let name = C.entity().name else { return [] }
    let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: name)
    fetchRequest.returnsObjectsAsFaults = false
    
    if let year = year {
        fetchRequest.predicate = NSPredicate(format: "date >= %@ AND date <= %@", Date().startOfYear(year: year) as CVarArg, Date().endOfYear(year: year) as CVarArg)
    }
    
    do {
        let fetched = try context.fetch(fetchRequest) // Memory leak is here
        guard let casted = fetched as? [C] else { return [] }
        return T.parseFromCoreData(from: casted)
    } catch let er {
        print(er.localizedDescription)
        return []
    }
}

Контекст определяется:

private var context: NSManagedObjectContext {
    CoreDataStack.managedObjectContext
}

У меня есть еще одна утечка памяти при разборе CoreDataObject на Struct:

static func getYearlyDataFrom(object: YearObject) -> YearlyData? {
    guard let objects = object.tableObjects else { return nil } // Memory leak
    var yearlyData: YearlyData = YearlyData()
    yearlyData.year = Int(object.year)
    
    var tableDatas: [TableData] = []
    
    for tableObject in objects { // Memory leak
        guard let tableObj = tableObject as? TableObject else { continue }
        guard let id = tableObj.id, let nameOfList = tableObj.nameOfList, let range = tableObj.nameOfList, let lastUpdate = tableObj.lastUpdate else { continue } // Memory leak
        tableDatas.append(TableData(id: id, nameOfList: nameOfList, range: range, lastUpdate: lastUpdate))
    }
    
    var playlists: [Playlist] = []
    
    for playlistObject in object.playlistObjects ?? NSSet() { // Memory leak
        guard let playlistObj = playlistObject as? PlaylistObject else { continue }
        guard let playlistId = playlistObj.playlistId, let date = playlistObj.date, let name = playlistObj.name, let imageURL = playlistObj.imageURL else { continue } // Memory leak
        var image: UIImage? = nil
        if let imageData = playlistObj.image {
            image = UIImage(data: imageData)
        }
        playlists.append(Playlist(playlistId: playlistId, name: name, position: Int(playlistObj.position), date: date, imageURL: imageURL, image: image))
    }
    
    yearlyData.playlists = playlists
    yearlyData.tables = tableDatas
    return yearlyData
}

Была ли у кого-нибудь такая же проблема?

1 Ответ

1 голос
/ 03 августа 2020

Объект context определяется как Computed-Property, вместо этого он должен быть State-Property и не должен вычисляться каждый раз при его вызове.

private var context = CoreDataStack.managedObjectContext
...