Когда я пытаюсь поймать данные из 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
}
Была ли у кого-нибудь такая же проблема?