Swift - Как сохранить MGLMapView в Core Data, чтобы отобразить его в табличном представлении?

Привет, ребята, я делаю работающее приложение, и у меня возникают проблемы с сохранением моего MGLMapView, который содержит графики, полученные от запущенного пользователя, в Core Data. Я не получаю никаких ошибок, но декодирование возвращает пустой MGLMapView без ploylines, как если бы он был только создан. Когда пользователь сохраняет свой прогон, он сохраняет всю информацию и отображает ее в табличном представлении. Я храню свой mapView и мой pointsArray (который содержит все CllocationCoordinates2D, созданные пользователем) в классе mapViewStore, как вы можете видеть здесь.

Моя сущность и атрибуты

Класс соответствует NSCoding, поэтому у него нет проблем при кодировании и декодировании mapView и pointsArray. Мне пришлось сломать координаты, так как я не могу полностью кодировать CllocationCoordinate2D.

import UIKit
import Mapbox
import MapKit
import CoreLocation

class MapViewStore: NSObject, NSCoding {

    var mapView: MGLMapView!
    var pointsArray: [CLLocationCoordinate2D] = []
    var latArray: [Double] = []
    var lonArray: [Double] = []
    init(mapView: MGLMapView, pointsArray: [CLLocationCoordinate2D]) {

        self.mapView = mapView
        self.pointsArray = pointsArray
    }

    required init(coder aDecoder: NSCoder) {
        self.mapView = aDecoder.decodeObject(forKey: "mapView") as? MGLMapView
        self.latArray = aDecoder.decodeObject(forKey: "latArray") as! [Double]
        self.lonArray = aDecoder.decodeObject(forKey: "lonArray") as! [Double]

        for i in 0..<lonArray.count {
            let coordinate = CLLocationCoordinate2D(latitude: latArray[i], longitude: lonArray[i])
            pointsArray.append(coordinate)
        }
    }

    func encode(with aCoder: NSCoder) {
        aCoder.encode(mapView, forKey: "mapView")

        for i in 0..<pointsArray.count {
            latArray.append(pointsArray[i].latitude)
            lonArray.append(pointsArray[i].longitude)
        }
        aCoder.encode(latArray, forKey: "latArray")
        aCoder.encode(lonArray, forKey: "lonArray")
    }

}

Правильно, если я ошибаюсь, но я думаю, что здесь происходит то, что когда я кодирую MGLMapView, он преобразует его в NSObject и теряет всю свою информацию. Поэтому, когда я конвертирую его обратно в MGLMapView, я получаю пустую карту. Есть ли способ избежать этого? Может хранить полилинии? Хотя я мог бы столкнуться с той же проблемой, если я это сделаю.

Я мог бы просто воссоздать полилинии на mapView с pointsArray, но производительность получит удар.

РЕДАКТИРОВАТЬ: Для людей, чьи просмотра это сейчас. Не делай этого. Я хотел создать mapView внутри ячейки таблицы, что очень плохая идея. Вместо этого сделайте снимок и сохраните изображение. Я только учусь этому сейчас.

1 ответ

Решение

Что более вероятно, что MGLMapView просто не кодирует линии поли как часть его NSCoding методы. UIView соответствует NSCodingтак что все его подклассы наследуют это. Но это не значит, что все они добавляют все необходимое для полного кодирования / декодирования. Посмотрите на исходный код дляMGLMapView показывает, что он не реализует encodeWithCoder, что почти наверняка объяснение.

Очень необычно сохранять объект представления в вашей модели данных, будь то с помощью Core Data или любой другой опции. Вам нужно будет заново создать состояние представления из объектов модели. Это может быть вашим существующим pointsArray, Это выглядит как MGLPolyLine кодирует его точки, чтобы вы могли использовать его через NSCoding если хочешь.

Другие вопросы по тегам