Swift - 加载外部数据的变量范围

时间:2018-03-09 15:24:48

标签: ios swift scope mapbox

我使用的是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数据文件,并为分组项创建自定义对象。但是文件的结构是完全随机的,意味着对象类的属性需要完全是选项,但是有些是延迟加载/计算的属性,这些属性与我的早期测试中的选项不兼容...

1 个答案:

答案 0 :(得分:1)

听起来您有几个问题:从数据包中加载数据,并使其可全局访问。

如果数据永远不会改变,那么只需从你的包中读取它就可以了。如果它可能在应用程序的生命周期中发生变化,您可能希望编写在启动时运行的代码,该代码将在启动时检查文档中的文件,并将其从捆绑包复制到文档目录(如果它&#39) ; s未找到,然后从文档中打开。

然后,您需要查询服务器以查看您的数据是否是最新的(使用版本号或更新时间戳。)如果更改了,您可以下载新数据,另存对文档的更改,还会更新版本/时间戳。

至于在整个应用范围内提供数据,这可能是数据容器单例的一个很好的用例。单例将有查询地图数据的方法,它将负责我上面描述的加载/更新逻辑。

或者,您可能会认为数据可以很好地映射到核心数据。

至于如何设计数据模型,这是一个单独的对话,您需要提供更多信息。