#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 и, в идеале, между несколькими устройствами пользователя.
Пользователь также должен иметь возможность просматривать все аннотации, отсортированные по стране, а затем по штату.
Каков хороший способ подойти к этому? Я попытался разбить его на:
- Найдите хороший способ хранения аннотаций — GeoJSON, возможно, не идеален, учитывая пункты 2 и (особенно) 3? Должен ли я изучить настройку базы данных?
- Заполните a
tableView
всеми аннотациями в базе данных, причем в первойtableView
показаны все страны, и, нажав на строку, переходящую в другуюtableView
со всеми штатами в этой стране, а другая переходит в третьюtableView
с каждой аннотацией в этом состоянии. - Позволяя пользователю отмечать выбранные аннотации как избранные и заполнять новые
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()
}
}