Лучший способ сохранить 1000 аннотаций MapKit показать аннотации в TableView

#ios #swift #uitableview #mapkit #geojson

#iOS #swift #uitableview #mapkit #geojson

Вопрос:

Вопрос: Каков наилучший способ хранения 1000 MapKit аннотаций, которые будут отображаться на карте и также должны быть доступны для просмотра в a tableView ? Пользователь также должен иметь возможность отмечать выбранные аннотации как избранные и отображать их отдельно tableView .

Предыстория: я изучаю программирование на iOS (через Udemy, Google и Stack Overflow). В настоящее время я пытаюсь создать MapKit приложение на основе a, которое отображает несколько аннотаций на карте. Каждая аннотация представляет определенный тип местоположения. Для целей тестирования я создал фиктивный файл GeoJSON (расположенный в приложении, а не на сервере), в котором хранится каждое местоположение, например:

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

Это работает нормально; мои фиктивные объекты анализируются и помещаются на карту просто отлично. Но в конечном итоге у меня будет 1000 реальных аннотаций, а не только моя горстка фиктивных аннотаций.

Просмотр карты

Вот где моих навыков недостаточно: я хочу, чтобы пользователь мог пометить определенное местоположение как избранное, которое, конечно, должно сохраняться через обновления приложений, обновления iOS и, в идеале, между несколькими устройствами пользователя.

Просмотр избранного

Пользователь также должен иметь возможность просматривать все аннотации, отсортированные по стране, а затем по штату.

Просмотр просмотра

Каков хороший способ подойти к этому? Я попытался разбить его на:

  1. Найдите хороший способ хранения аннотаций — GeoJSON, возможно, не идеален, учитывая пункты 2 и (особенно) 3? Должен ли я изучить настройку базы данных?
  2. Заполните a tableView всеми аннотациями в базе данных, причем в первой tableView показаны все страны, и, нажав на строку, переходящую в другую tableView со всеми штатами в этой стране, а другая переходит в третью tableView с каждой аннотацией в этом состоянии.
  3. Позволяя пользователю отмечать выбранные аннотации как избранные и заполнять новые tableView только теми, которые отмечены как избранные.

Комментарии:

1. Ну, MapKit очень, очень быстр при работе с аннотациями. У меня есть проект с несколькими десятками тысяч аннотаций без каких-либо проблем. Так что в этом направлении проблем может и не возникнуть. Хранение всех этих аннотаций, ну, есть некоторые возможности, и самый простой способ запустить и запустить его — использовать «UserDefaults» ( developer.apple.com/documentation/foundation/userdefaults ). Это был бы не очень элегантный способ, но он будет работать, и вы сможете продолжить разработку, чтобы выяснить, каковы ключевые требования к вашему приложению. После этого вы работаете над стратегией хранения.

2. Для просмотров таблиц: в viewDidLoad() получите данные, которые вы хотите отобразить в локальной структуре данных. Вам также следует прочитать о различных моделях архитектуры. Хорошая статья для чтения: medium.com/flawless-app-stories /…

Ответ №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()
}
 

}