【问题标题】:Best way to store 1000's of MapKit annotations + show annotations in tableView存储 1000 个 MapKit 注释的最佳方法 + 在 tableView 中显示注释
【发布时间】:2021-02-23 20:59:40
【问题描述】:

问题:存储 1000 条 MapKit 注释的最佳方式是什么,这些注释将显示在地图上,并且还应该可以在 tableView 中浏览?用户还应该能够将选定的注释标记为收藏夹,并将它们显示在单独的tableView 中。

背景:我正在学习 iOS 编程(通过 Udemy、Google 和 Stack Overflow)。我目前正在尝试制作一个基于MapKit 的应用程序,该应用程序在地图上显示许多注释。每个注释代表一种特定类型的位置。出于测试目的,我制作了一个虚拟 GeoJSON 文件(位于应用程序中,而不是服务器上),它存储每个位置,如下所示:

 {
        "type" : "Feature",
        "properties" : {
            "location" : "Norway",
            "title" : "Annotation Title",
            "website" : "http://www.stackoverflow.com",
        },
        "geometry" : {
            "type" : "Point",
            "coordinates" : [10, 60]
        }
    },

这很好用;我的虚拟对象被解析并放在地图上就好了。但最终,我将拥有 1000 多个真实注释,而不仅仅是我的少数虚拟注释。

Map View

这是我的技能不足的地方:我希望用户能够将特定位置标记为收藏,这当然应该通过应用更新、iOS 更新以及理想情况下在用户的多个设备之间持续存在。

Favorites view

用户还应该能够浏览所有注释,按国家和州排序。

Browse view

解决这个问题的好方法是什么?我试着把它分解成:

  1. 找到一种存储注释的好方法——考虑到第 2 点和(特别是)第 3 点,GeoJSON 可能并不理想?我应该查看数据库设置吗?

  2. 用数据库中的所有注释填充tableView,第一个tableView 显示所有国家,然后点击一行连接到另一个tableView 与该国家的所有州,另一个连接到第三个@ 987654334@ 与处于该状态的每个注释。

  3. 让用户将选定的注释标记为收藏,并仅使用标记为收藏的注释填充新的tableView

【问题讨论】:

  • 嗯,MapKit 在处理注释时非常非常快。我有一个包含数万个注释的项目,没有问题。所以这个方向可能没有问题。存储所有注释,有一些可能性,最简单的启动和工作方法应该是使用“userDefaults”(developer.apple.com/documentation/foundation/userdefaults)。这不是一种非常优雅的方式,但它会起作用,您可以进一步开发以找出您的应用程序的关键要求是什么。之后,您将制定存储策略。
  • 对于 tableViews:在 ViewDidLoad() 中获取要在本地 dataStructure 中显示的数据。您还应该阅读不同的架构模型。这篇文章很好读:medium.com/flawless-app-stories/…

标签: ios swift uitableview mapkit geojson


【解决方案1】:

在我回答这个问题之前,我想指出,在地图上显示 1000 个 MKAnnotationView 本身也是一个完整的问题,您可能需要考虑使用 dequeueReusableAnnotationViewWithIdentifier: 方法或 MKClusterAnnotation 来处理这些注释避免屏幕延迟。

现在回答您的实际问题,而不是考虑如何为您的应用中的一项功能存储数据。更多地考虑应该如何为整个应用程序本身存储数据。

https://www.iosapptemplates.com/blog/ios-development/data-persistence-ios-swift - 此链接讨论了持久数据存储的各种选项及其优缺点。正如您所说,您目前正在学习 iOS 课程我建议 CoreData,因为它是一个原生 IOS 特定框架,可以很好地补充您的学习,并且可能会被 Udemy 覆盖。另一个原因是 CoreData 易于设置和学习,有大量来自 Apple 的文档,因此对于“新手”来说应该是一个好的开始。

CoreData 示例

创建你的模型

创建一个 CoreData 管理器

class CoreDataManager {
static let shared = CoreDataManager()
private init() {}
private lazy var persistentContainer: NSPersistentContainer = {
    let container = NSPersistentContainer(name: "PillReminder")
    container.loadPersistentStores(completionHandler: { _, error in
        _ = error.map { fatalError("Unresolved error \($0)") }
    })
    return container
}()

var mainContext: NSManagedObjectContext {
    return persistentContainer.viewContext
}

func backgroundContext() -> NSManagedObjectContext {
    return persistentContainer.newBackgroundContext()
}

加载药丸数组

func loadPills() -> [Pill] {
let mainContext = CoreDataManager.shared.mainContext
let fetchRequest: NSFetchRequest<Pill> = Pill.fetchRequest()
do {
    let results = try mainContext.fetch(fetchRequest)
    return results
}
catch {
    debugPrint(error)
}

保存一个新的 Pill 实体

func savePill(name: String) throws {
let context = CoreDataManager.shared.backgroundContext()
context.perform {
    let entity = Pill.entity()
    let pill = Pill(entity: entity, insertInto: context)
    pill.name = name
    pill.amount = 2
    pill.dozePerDay = 1
    pill.lastUpdate = Date()
    try context.save()
}

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多