我使用的是Mapbox框架。我已经使用他们的Studio(Web应用程序)创建了一些我作为GeoJSON文件下载的地图形状(多边形和坐标)。此文件与我的iOS应用程序捆绑在一起。所有提供的示例都非常小,并且结构简单,就像viewDidLoad
中所有剩余的代码一样。
我正在尝试设计应用程序,以便数据加载一次,然后可以访问此变量,以便能够根据需要添加和/或删除其中一些映射项。
我应该使用全局变量吗?如果是这样,我应该在哪里声明data
变量,以便可以在任何地方访问它?或者这是不好的做法,我应该在具有较少范围访问权限的地方加载data
变量并在适当的函数调用中传递对象本身?这不会让人感到困惑吗?初始data
加载viewDidLoad()
的最佳位置在哪里?
do {
let url = URL(fileURLWithPath: Bundle.main.path(forResource: "features", ofType: "geojson")!)
let data = try Data(contentsOf: url)
} catch {
print(error)
}
然后我会有其他功能可以过滤这个数据集,只添加或删除特定的地图对象。
func loadSomeData(forGroup name: String, withData data: Data) {
let shapeCollection = try MGLShape(data: data, encoding: String.Encoding.utf8.rawValue) as! MGLShapeCollectionFeature
for shape in shapeCollection.shapes {
if shape.attribute(forKey: "group") as! String == name {
if let point = shape as? MGLPointAnnotation {
// ADD ITEM TO MAP
} else if let polygon = shape as? MGLPolygon {
// ADD ITEM TO MAP
}
}
}
}
var group = "group1"
loadSomeData(forGroup: group)
因此,这将为具有“group1”属性的所有对象过滤相同的原始数据源,并仅加载它们(它将先删除现有对象,并可能做很多其他事情 - 我只需要掌握基础知识...)
最后,我更愿意解析GeoJSON数据文件,并为分组项创建自定义对象。但是文件的结构是完全随机的,意味着对象类的属性需要完全是选项,但是有些是延迟加载/计算的属性,这些属性与我的早期测试中的选项不兼容...
答案 0 :(得分:1)
听起来您有几个问题:从数据包中加载数据,并使其可全局访问。
如果数据永远不会改变,那么只需从你的包中读取它就可以了。如果它可能在应用程序的生命周期中发生变化,您可能希望编写在启动时运行的代码,该代码将在启动时检查文档中的文件,并将其从捆绑包复制到文档目录(如果它&#39) ; s未找到,然后从文档中打开。
然后,您需要查询服务器以查看您的数据是否是最新的(使用版本号或更新时间戳。)如果更改了,您可以下载新数据,另存对文档的更改,还会更新版本/时间戳。
至于在整个应用范围内提供数据,这可能是数据容器单例的一个很好的用例。单例将有查询地图数据的方法,它将负责我上面描述的加载/更新逻辑。
或者,您可能会认为数据可以很好地映射到核心数据。
至于如何设计数据模型,这是一个单独的对话,您需要提供更多信息。