升级Mapbox v11 SDK后,TileRegionLoadProgressCallback无法实时回调下载进度
Mapbox v11 SDK离线瓦片下载进度回调问题解决方案
问题根源
你当前的代码存在两个核心问题:
TileRegionLoadProgressCallback没有接收并使用进度参数,导致无法获取具体进度数据;- 对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
相关产品推荐
相关产品推荐

