You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

升级Mapbox v11 SDK后,TileRegionLoadProgressCallback无法实时回调下载进度

Mapbox v11 SDK离线瓦片下载进度回调问题解决方案

问题根源

你当前的代码存在两个核心问题:

  1. TileRegionLoadProgressCallback没有接收并使用进度参数,导致无法获取具体进度数据;
  2. 对v11 SDK的进度回调触发逻辑理解有误,同时可能忽略了TileRegionLoadOptions的关键配置。

修正后的代码实现

首先,正确实现TileRegionLoadProgressCallback,接收TileRegionLoadProgress参数以获取进度详情:

func updateProgress() -> TileRegionLoadProgressCallback {
    return { progress in
        // 切换到主线程更新UI或打印日志(回调默认在后台线程执行)
        DispatchQueue.main.async {
            // 获取核心进度数据
            print("已完成资源数: \(progress.completedResourceCount),总需资源数: \(progress.requiredResourceCount)")
            
            // 可选:获取字节级进度
            if let completedBytes = progress.completedResourceSize, let totalBytes = progress.requiredResourceSize {
                let progressPercent = (Double(completedBytes) / Double(totalBytes)) * 100
                print("下载进度: \(String(format: "%.2f", progressPercent))%")
            }
            
            // 可选:查看失败的资源数
            if progress.failedResourceCount > 0 {
                print("已失败资源数: \(progress.failedResourceCount)")
            }
        }
    }
}

然后调用loadTileRegion时,确保TileRegionLoadOptions配置正确:

// 示例:配置下载区域、缩放范围等参数
let targetGeometry = Geometry(coordinate: CLLocationCoordinate2D(latitude: 39.9, longitude: 116.3), radius: 1000)
let zoomRange = 14...16

let tileRegionLoadOptions = TileRegionLoadOptions(
    geometry: targetGeometry,
    zoomRange: zoomRange,
    styleURI: .streets, // 对应你使用的地图样式
    metadata: nil,
    skipExistingTiles: false // 如果需要重新下载已存在的瓦片,设为false;否则设为true会跳过已有资源
)

// 发起下载请求
let tileRegionDownload = tileStore.loadTileRegion(
    forId: "custom_offline_region",
    loadOptions: tileRegionLoadOptions,
    progress: updateProgress()
) { result in
    switch result {
    case .success(let region):
        print("离线区域下载完成: \(region.id)")
    case .failure(let error):
        print("离线区域下载失败: \(error.localizedDescription)")
    }
}

关键注意事项

  • 回调触发时机:v11的进度回调是每一批资源下载完成后触发,而非单个瓦片。如果测试的区域过小(仅包含少量瓦片),可能只会触发一次回调(直接完成),建议用较大的区域测试。
  • 缓存影响:如果skipExistingTiles设为true,且目标区域已有部分瓦片缓存,回调只会针对缺失的资源触发,次数会减少。
  • 线程切换:进度回调默认在后台线程执行,更新UI时必须切换到主线程,避免UI卡顿或崩溃。

内容的提问来源于stack exchange,提问作者ez4nick

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 12:22:21