2016-12-01 69 views
2

我正在使用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就像一個錯誤建造的世界之謎。

用我的一段代碼,你能看到我做的錯嗎?

回答

0

我無法找到這個內存/緩存管理問題與mapKit的原因。

我決定嘗試谷歌地圖,它花了不到2個小時來實現它,結果是驚人的。

我想通過Apple解決方案尊重蘋果社區,但Google Map爲我提供了更多的性能。