SwiftUI:如何在API调用后移动MapPin?

问题描述

我正在尝试使用SwiftUI的新Map组件。到目前为止,还算不错,但是现在,我正在努力在API响应后更新地图上的MapPins。 (以便通过地图移动来更新图钉)。 我已经使用TinyNetworking进行了网络通话,并且通话正常,但是MapPins没有更新,我也不明白为什么。

这是一些代码

网络通话:

@Observedobject var places = Resource(endpoint: getPlaces())

地图声明:

 var locations: [Location]
 Map(coordinateRegion: $viewmodel.region,interactionModes: .all,showsUserLocation: true,userTrackingMode: $trackingMode,annotationItems: locations) { location -> MapPin in
     MapPin(coordinate: location.coordinate,tint: .red)

 }

放置结构:

struct Place: Codable {
  let title: String
  let coordinates: Coordinates
}

位置结构:

struct Location: Identifiable {
  let id = UUID()
  let title: String
  let coordinate: CLLocationCoordinate2D
}

这是我尝试建立连接的地方:

MapView(followUser: $followUser,locations: convertPlacesToLocation(newPlaces: places))

private func convertPlacesToLocation(newPlaces: Resource<[Place]>) -> [Location] {
    var locations: [Location] = []
    if let values = newPlaces.value {
        for place in values {
            locations.append(Location(title: place.title,coordinate: .init(latitude: place.coordinates.lat,longitude: place.coordinates.lon)))
        }
    }        
    return locations
}

convertPlacesToLocation确实被调用了两次:第一次加载地图时,在网络调用返回之前,以及在调用返回之后,值是正确的。 但是MapPin没有更新...

有什么想法吗?

以下是进行网络呼叫和重新加载地点的代码

final class Resource<A>: ObservableObject {
    let endpoint: Endpoint<A>

    @Published var value: A?

    init(endpoint: Endpoint<A>) {
        self.endpoint = endpoint
        reload()
    }
    
    func reload() {
        URLSession.shared.load(endpoint) { result in
            dispatchQueue.main.async {
                self.value = try? result.get()
            }
        }
    }
}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)