【问题标题】:Adding annotations to `MKMapView` from `URLSession` data从 `URLSession` 数据向 `MKMapView` 添加注释
【发布时间】:2020-08-06 22:25:13
【问题描述】:

我正在尝试向单个视图应用程序的MKMapView 添加注释。注释的坐标来自我使用URLSession.dataTask 获取的JSON 数据,我发现地图视图的更新速度比获取、解析和放入相关数组中的数据要快。我应该如何解决这个问题?相关地图视图代码如下。

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)
        }
    }

【问题讨论】:

    标签: swift mkmapview urlsession


    【解决方案1】:

    您可以在解码后立即添加注释。

    let decodedData = try decoder.decode(Response.self, from: responseData)
    DispatchQueue.main.async {
        mapView.addAnnotations(decodedData.sensors)
    }
    

    【讨论】:

    • 不幸的是,它不会显示注释。更正:当我从viewDidLoad() 中删除mapView.addAnnotations(sensors) 时,它现在可以工作了!谢谢!
    • 不过,它的工作并不完美。注释确实出现了,但是在我稍微拖动地图之后,可能会导致视图更新。
    • 谢谢!现在无需拖动地图。
    猜你喜欢
    • 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
    相关资源
    最近更新 更多