我想到了。为了将 MapItem 存储在 Core Data 中,我使用了 NSKeyedArchiver。它将 MapItem 编码为 Data 并进行解码,您可以使用 NSKeyedUnarchiver
func saveMapItems(_ mapItems: [MKMapItem]) {
do {
let data = try NSKeyedArchiver.archivedData(withRootObject: mapItems, requiringSecureCoding: false)
let request: NSFetchRequest<RecentSearchLocation> = RecentSearchLocation.fetchRequest()
if
let recentLocations = try? coreDataManager.persistentContainer.viewContext.fetch(request).first,
let location = recentLocations {
location.mapItems = data
} else {
let location = RecentSearchLocation(context: coreDataManager.persistentContainer.viewContext)
location.mapItems = data
}
} catch {
print("Can't encode data: \(error)")
}
do {
try coreDataManager.persistentContainer.viewContext.save()
} catch {
print("Error saving context \(error)")
}
}
为了解码我做了这个
func readMapItems() -> [MKMapItem] {
let request: NSFetchRequest<RecentSearchLocation> = RecentSearchLocation.fetchRequest()
guard
let data = try? coreDataManager.persistentContainer.viewContext.fetch(request).first?.mapItems,
let dataToUnarchive = data else {
print("Cannot get mapItems from coreData data")
return []
}
do {
guard let recentSearchLocations = try NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(dataToUnarchive) as? [MKMapItem] else {
return []
}
return recentSearchLocations
} catch {
print("Error unarchiving mapItems, \(error)")
return []
}
}