【问题标题】:Multiple GMSMarker show/hide consumes time多个 GMSMarker 显示/隐藏消耗时间
【发布时间】:2018-04-11 04:52:46
【问题描述】:

我在 GoogleMap 上有大约 4000 个标记,但我没有使用聚类。所以,目前我在地图上显示/隐藏标记的操作如下。

marker.map = nil 
marker.map = mapView

在某些情况下,我需要过滤掉一些标记并使它们可见,否则应该隐藏它们。所以我可以通过代码来实现它,但需要花费时间。

markers.forEach { (marker) in
                if !arrDeviceID.contains(marker.deviceID ?? "") {
                        marker.map = nil
                } else {
                        marker.map = self.googleMapView
                }
            }

Android 中有一个属性Visibility,它运行完美且快速。但是在 iOS 中没有这样的属性。

那么我可以做些什么来提高性能。

【问题讨论】:

  • 您可以拥有一个标记字典,其中键是 Id,值是标记,而不是标记数组并用 o(n^2) 枚举它。您可以使用 o(n) 访问每个标记。
  • marker.opacity = 0 隐藏标记而不删除它。通过marker.map = nil,您正在从地图中删除叠加层并将其添加回来,这需要时间。
  • 你的复杂度是 o(n2)。您可以使用标记字典并迭代 arrDeviceId。
  • @TheTiger marker.opacity = 0 将隐藏标记,但我猜它仍会收到点击。我会继续尝试。
  • @Mina 看起来很有希望将数组替换为字典。

标签: ios swift google-maps google-maps-sdk-ios


【解决方案1】:

让我们说这是你的标记数组

var markers = [GMSMarker]()

准备标记字典,假设您的设备 ID 在 Int 中

func prepareMarkersDict(markers:[GMSMarker]) -> [Int:GMSMarker]{
    var markerDict = [Int:GMSMarker]()
    for marker in markers{
        markerDict[marker. deviceID] = marker
    }
    return markerDict
}

您要隐藏的设备 ID 数组

var arrDeviceIDToHide = [Int]()

现在迭代它并隐藏标记

let markerDict = prepareMarkersDict(markers:markers)
for deviceId in arrDeviceIDToHide{
   let marker = markerDict[deviceId]
   marker?.map = nil
}

【讨论】:

    【解决方案2】:

    实现将类似于以下内容:

    var markers: [Int: GMSMarker] = [:]
    func addMarker(with identifier: Int) {
     let marker = GMSMarker(position: someCoordinates)
     markers[identifier] = marker
    }
    func removeMarker(with identifier: Int) {
      markers[identifier]?.map = nil
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-27
      • 2012-04-04
      • 2013-01-16
      • 2012-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多