我正在使用MapKit,通過在mapView中添加MKTileOverlay來創建衛星和雷達動畫。MKTileOverlay和PINCache庫的iOS/MapKit緩存管理問題
使用UISlider和PlayButton,我可以通過播放MKOverlayRenderer的Alpha(根據滑塊的位置將它們設置爲0或0.75)來創建動畫,就像GIF一樣。
動畫非常流暢,我所有的衛星和雷達瓷磚都在mapView上正確加載。
我遇到了緩存管理的一個問題。
我意識到MapKit沒有爲我的tileOverlay使用緩存,這就是爲什麼我使用PINCache庫來保存我的瓷磚,以便它不會在每次播放動畫時請求和下載圖像。
我的實現:
我重寫,以建立我的網址,讓我的平鋪圖像的方法URLForTilePath
。
- (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
是我的緩存管理 - 關鍵我有順序排序和區分的瓷磚,類型(雷達或衛星,不同的圖像,不同的URL),以及日期2倍重要的價值。
我可以看到緩存管理工作時,疊加的渲染方式更快,但我現在遇到的主要問題是,它並沒有在根據協調加載並構建瓷磚。
我的mapView就像一個錯誤建造的世界之謎。
用我的一段代碼,你能看到我做的錯嗎?