iOS / MAPKIT缓存管理问题,与Mktileoverlay和Pincache库



我正在使用mapkit,以通过在mapview上添加mktileoverlay来创建卫星和雷达动画。

使用Uislider和Playbutton,我可以通过使用Mkoverlayrenderer的Alpha来创建一个动画,就像GIF一样(根据我的滑块的位置将它们设置为0或0.75)。

)。

动画非常平滑,我所有的卫星和雷达瓷砖都在MapView上正确加载。

我正在遇到缓存管理的一个问题。

我意识到Mapkit没有将缓存用于我的瓷砖,这就是为什么我使用库Pincache来保存瓷砖,以便每次播放动画时都不会请求并下载图像。p> 我的实现:

我覆盖方法URLForTilePath以构建我的URL以获取瓷砖图像。

- (NSURL *)URLForTilePath:(MKTileOverlayPath)path{
double latMin, latMax, longMin, longMax;
path.contentScaleFactor = 1.0;
NSMutableArray *result = [[NSMutableArray alloc] init];
result = getBBoxForCoordinates((int)path.x, (int)path.y, (int)path.z);
longMin = [[result objectAtIndex:0] doubleValue];
latMin = [[result objectAtIndex:1] doubleValue];
longMax = [[result objectAtIndex:2] doubleValue];
latMax = [[result objectAtIndex:3] doubleValue];
NSString *finalURL = self.url;
finalURL = [finalURL stringByReplacingOccurrencesOfString:@"DATE"
                                     withString:_date];
NSString *bbox = [NSString stringWithFormat:@"bbox=%f,%f,%f,%f", longMin, latMin, longMax, latMax];
finalURL = [finalURL stringByReplacingOccurrencesOfString:@"BBOX"
                                     withString:bbox];
return [NSURL URLWithString:finalURL];
}

和将调用URLForTilePath的关键方法是我的loadTileAtPath

    - (void)loadTileAtPath:(MKTileOverlayPath)path
                result:(void (^)(NSData *data, NSError *error))result
{
    if (!result)
    {
        return;
    }
    NSString *str = self.isRadar == true ? [NSString stringWithFormat:@"Radar%@", self.date] : [NSString stringWithFormat:@"Satellite%@", self.date];
    NSData *cachedData = [[PINCache sharedCache] objectForKey:str];
    if (cachedData)
    {
        result(cachedData, nil);
    }
    else
    {
        NSURLRequest *request = [NSURLRequest requestWithURL:[self URLForTilePath:path]];
        [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
            NSString *str = self.isRadar == true ? [NSString stringWithFormat:@"Radar%@", self.date] : [NSString stringWithFormat:@"Satellite%@", self.date];
            [[PINCache sharedCache] setObject:data forKey:str block:nil];
            result(data, connectionError);
        }];
    }
}

基本上我要实现的目标是:

  • 检查我是否已缓存数据,如果是的,请获取对象。
  • 如果没有,我提出请求以便使用URLForTilePath给出的URL下载瓷砖。
  • 然后我将对象设置为缓存。
  • 字符串 str是我的高速缓存管理的关键
  • 我有2个重要值,以分类和区分瓷砖,类型(雷达或卫星,不同的图像,不同的URL)和日期。

我可以看到缓存管理正在工作,叠加层的渲染速度更快,但是我遇到的主要问题是它不会在坐标处加载和构建图块。

我的MapView就像世界上的一个难题。

用我的代码,你能看到我做错了什么吗?

我找不到此内存/缓存管理问题的原因。

我决定尝试使用GoogleMap,这花了不到2个小时的时间来实施它,结果很棒。

我想通过使用Apple解决方案来尊重Apple社区,但是Google Map为我提供了更多的性能。

最新更新