从“URLSession”数据向“MKMapView”添加注释
Adding annotations to `MKMapView` from `URLSession` data
我正在尝试向单视图应用程序的 MKMapView
添加注释。注释的坐标来自 JSON
我用 URLSession.dataTask
获取的数据,我发现地图视图的更新速度比数据获取、解析和放入相关数组的速度更快。我应该如何解决这个问题?相关地图查看代码如下。
import UIKit
import MapKit
import CoreLocation
class MapViewController: UIViewController {
// MARK: - Properties
@IBOutlet weak var mapView: MKMapView!
let locationManager = CLLocationManager()
var userLocation: CLLocation?
var sensors = [Sensor]()
let mapCenter = CLLocationCoordinate2D(latitude: 60.227704, longitude: 24.983821)
var region = MKCoordinateRegion()
// MARK: - Lifecycle
override func viewDidLoad() {
super.viewDidLoad()
let endpoint = "uiras2_v1"
let url = uirasURL(with: endpoint)
self.performRequest(url: url)
self.mapView.addAnnotations(self.sensors)
region = MKCoordinateRegion(center: mapCenter, latitudinalMeters: 8000, longitudinalMeters: 25000)
mapView.setRegion(mapView.regionThatFits(region), animated: true)
mapView.showsUserLocation = true
}
// MARK: - TODO data fetching
func performRequest(url: URL) {
// create URLSession
let session = URLSession(configuration: .default)
// give session task
let task = session.dataTask(with: url) { (data, response, error) in
if error != nil {
print(error as Any)
return
}
if let safeData = data {
self.parseJSON(responseData: safeData)
}
}
// start the task
task.resume()
}
func parseJSON(responseData: Data) {
let decoder = JSONDecoder()
do {
let decodedData = try decoder.decode(Response.self, from: responseData)
for sensor in decodedData.sensors {
sensors.append(sensor.value)
}
} catch {
print(error)
}
}
您可以在解码后立即添加注释。
let decodedData = try decoder.decode(Response.self, from: responseData)
DispatchQueue.main.async {
mapView.addAnnotations(decodedData.sensors)
}
我正在尝试向单视图应用程序的 MKMapView
添加注释。注释的坐标来自 JSON
我用 URLSession.dataTask
获取的数据,我发现地图视图的更新速度比数据获取、解析和放入相关数组的速度更快。我应该如何解决这个问题?相关地图查看代码如下。
import UIKit
import MapKit
import CoreLocation
class MapViewController: UIViewController {
// MARK: - Properties
@IBOutlet weak var mapView: MKMapView!
let locationManager = CLLocationManager()
var userLocation: CLLocation?
var sensors = [Sensor]()
let mapCenter = CLLocationCoordinate2D(latitude: 60.227704, longitude: 24.983821)
var region = MKCoordinateRegion()
// MARK: - Lifecycle
override func viewDidLoad() {
super.viewDidLoad()
let endpoint = "uiras2_v1"
let url = uirasURL(with: endpoint)
self.performRequest(url: url)
self.mapView.addAnnotations(self.sensors)
region = MKCoordinateRegion(center: mapCenter, latitudinalMeters: 8000, longitudinalMeters: 25000)
mapView.setRegion(mapView.regionThatFits(region), animated: true)
mapView.showsUserLocation = true
}
// MARK: - TODO data fetching
func performRequest(url: URL) {
// create URLSession
let session = URLSession(configuration: .default)
// give session task
let task = session.dataTask(with: url) { (data, response, error) in
if error != nil {
print(error as Any)
return
}
if let safeData = data {
self.parseJSON(responseData: safeData)
}
}
// start the task
task.resume()
}
func parseJSON(responseData: Data) {
let decoder = JSONDecoder()
do {
let decodedData = try decoder.decode(Response.self, from: responseData)
for sensor in decodedData.sensors {
sensors.append(sensor.value)
}
} catch {
print(error)
}
}
您可以在解码后立即添加注释。
let decodedData = try decoder.decode(Response.self, from: responseData)
DispatchQueue.main.async {
mapView.addAnnotations(decodedData.sensors)
}