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

Ios Swift-加载外部数据的可变范围,ios,swift,scope,mapbox,Ios,Swift,Scope,Mapbox,我正在使用Mapbox框架。我使用他们的Studio(web应用程序)创建了一些地图形状(多边形和坐标),并将其下载为GeoJSON文件。此文件与我的iOS应用程序捆绑在一起。所有提供的示例都非常小,并且结构简单,如viewdiload将包含所有剩余的代码 我正在尝试设计应用程序,以便加载一次数据,然后可以访问此变量,以便能够根据需要添加和/或删除一些映射项 我应该使用全局变量吗?如果是这样,我应该在哪里声明数据变量,以便可以在任何地方访问它?或者这是一种糟糕的做法,我应该在范围访问较少的地方加

我正在使用Mapbox框架。我使用他们的Studio(web应用程序)创建了一些地图形状(多边形和坐标),并将其下载为GeoJSON文件。此文件与我的iOS应用程序捆绑在一起。所有提供的示例都非常小,并且结构简单,如
viewdiload
将包含所有剩余的代码

我正在尝试设计应用程序,以便加载一次数据,然后可以访问此变量,以便能够根据需要添加和/或删除一些映射项

我应该使用全局变量吗?如果是这样,我应该在哪里声明
数据
变量,以便可以在任何地方访问它?或者这是一种糟糕的做法,我应该在范围访问较少的地方加载
数据
变量一次,并在适当的函数调用中传递对象本身?这难道不会让人困惑吗?初始
数据
加载,
viewDidLoad()
的最佳位置在哪里

然后,我将有其他功能,可以过滤这个数据集,并只添加或删除特定的地图对象

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数据文件,并为分组项创建自定义对象。但是文件的结构是完全随机的,这意味着对象类的属性需要完全是optionals,但从我早期的测试来看,有些是延迟加载/计算的属性,不能很好地与optionals一起工作…

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

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

然后,您需要查询服务器,查看您的数据是否为最新数据(使用版本号或更新时间戳)。如果数据发生更改,您需要下载新数据,保存对文档的更改,并更新版本/时间戳

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

或者,您可以决定数据将很好地映射到核心数据


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

数据用于映射不同高尔夫球场的数据。每门课程都会有一个数据文件,它只会随着时间的推移而很少改变,所以我不太在意它,我会实现一个版本控制属性或类似的属性。我刚刚尝试了我的示例代码,但是
数据
变量只能在
do{}catch{}
块中访问,所以我也不能使用它!从未听说/读过“数据容器单例”-swift新手。我将有一个搜索…从我所阅读的,Singleton的被视为一个更简单的解决方案,但可能不是首选。“依赖注入”似乎更受欢迎,但我似乎无法使上述代码在此结构中工作。我将
CourseData
结构放入CourseData.swift中,并将
ModelController
类放入ModelController.swift中。当我尝试在ModelController中实例化CourseData实例时,它不会自动填充结构的init参数。我做错了什么?
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)