Как преобразовать MKMapItem в двоичные данные для хранения в Core Data? - PullRequest
0 голосов
/ 06 марта 2019

Я хочу сохранить MKMapItem, который ранее был найден MKLocalSearch, в Core Data, чтобы я мог показать его пользователю при загрузке представления в будущем.

У меня есть объект, который я создал вФайл xcdatamodeld и создал атрибут binaryData с именем mapItem.

Я хочу закодировать найденный MKMapItem в двоичные данные и сохранить его в основных данных.

Позже я хочу декодировать его в MKMapItem.

Я заметил, что у MKMapItem есть метод кодирования, которому нужен объект NSCoder.

Я не очень знаком с NSCoding, поэтому любая помощь будет оценена.

Я всегда могу сохранитьстроковые атрибуты из MKMapItem в основных данных путем создания нескольких атрибутов для сущности, но мне было интересно, есть ли простой способ.

Спасибо!

1 Ответ

1 голос
/ 23 марта 2019

Я понял это. Чтобы сохранить MapItem в Core Data, я использовал NSKeyedArchiver. Он кодирует MapItem в данные и для декодирования вы можете использовать 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 []
        }
    }
...