菜鸟教程小白 发表于 2022-12-11 18:12:31

MKTileOverlay 和 PINCache 库的 iOS/MapKit 缓存管理问题


                                            <p><p>我正在使用 MapKit 通过在 mapView 上添加 MKTileOverlay 来创建卫星和雷达动画。</p>

<p>使用 UISlider 和 PlayButton,我可以通过播放 MKOverlayRenderer 的 alpha(根据 slider 的位置将它们设置为 0 或 0.75)来创建动画,例如 GIF。</p>

<p>动画非常流畅,我所有的卫星和雷达图 block 都在 mapView 上正确加载。</p>

<p>我在缓存管理方面遇到了一个问题。</p>

<p>我意识到 MapKit 没有为我的 tileOverlay 使用缓存,这就是为什么我使用库 PINCache 来保存我的图 block ,这样它就不会在我每次播放动画时请求和下载图像。</p>

<p><strong>我的实现:</strong> </p>

<p>我重写了方法 <code>URLForTilePath</code> 以构建我的 URL 来获取我的平铺图像。</p>

<pre><code>- (NSURL *)URLForTilePath:(MKTileOverlayPath)path{

double latMin, latMax, longMin, longMax;
path.contentScaleFactor = 1.0;

NSMutableArray *result = [ init];
result = getBBoxForCoordinates((int)path.x, (int)path.y, (int)path.z);

longMin = [ doubleValue];
latMin = [ doubleValue];
longMax = [ doubleValue];
latMax = [ doubleValue];

NSString *finalURL = self.url;
finalURL = [finalURL stringByReplacingOccurrencesOfString:@&#34;DATE&#34;
                                     withString:_date];

NSString *bbox = ;
finalURL = [finalURL stringByReplacingOccurrencesOfString:@&#34;BBOX&#34;
                                     withString:bbox];

return ;
}
</code></pre>

<p>调用 <code>URLForTilePath</code> 的关键方法是我对 <code>loadTileAtPath</code> 的实现:</p>

<pre><code>    - (void)loadTileAtPath:(MKTileOverlayPath)path
                result:(void (^)(NSData *data, NSError *error))result
{
    if (!result)
    {
      return;
    }

    NSString *str = self.isRadar == true ? : ;
    NSData *cachedData = [ objectForKey:str];
    if (cachedData)
    {
      result(cachedData, nil);
    }
    else
    {
      NSURLRequest *request = ];
       completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
            NSString *str = self.isRadar == true ? : ;
            [ setObject:data forKey:str block:nil];
            result(data, connectionError);
      }];
    }
}
</code></pre>

<p>基本上我想要实现的是:</p>

<ul>
<li>检查我是否有缓存数据,如果有则获取对象。</li>
<li>如果没有,我会发出请求以下载具有 <code>URLForTilePath</code> 给出的 URL 的磁贴。</li>
<li>然后我将对象设置为缓存。</li>
<li>字符串<code>str</code>是我的缓存管理Key</li>
<li>为了对图 block 进行排序和区分,我有 2 个重要的值、类型(雷达或卫星、不同的图像、不同的 URL)和日期。</li>
</ul>

<p>我可以看到缓存管理正在运行,叠加层的渲染速度更快,但我遇到的主要问题是它没有在相应的坐标处加载和构建图 block 。</p>

<p>我的 mapView 就像一个错误构建的世界的拼图。</p>

<p>通过我的一段代码,你能看出我做错了什么吗?</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>我找不到 mapKit 出现内存/缓存管理问题的原因。</p>

<p>我决定尝试使用 GoogleMap,实现它只用了不到 2 个小时,结果令人惊叹。 </p>

<p>我想通过使用 Apple 解决方案来尊重 Apple 社区,但 Googlemap 为我提供了更多的表现。</p></p>
                                   
                                                <p style="font-size: 20px;">关于MKTileOverlay 和 PINCache 库的 iOS/MapKit 缓存管理问题,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/40907584/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/40907584/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: MKTileOverlay 和 PINCache 库的 iOS/MapKit 缓存管理问题