【发布时间】:2014-03-15 18:40:50
【问题描述】:
您好,我正在使用MKTileOverlay 在我的iOS7 App 中展示 OpenStreetMap 瓷砖。现在我想实现缓存这些图块的能力。我在 NSHipster (http://nshipster.com/mktileoverlay-mkmapsnapshotter-mkdirections/) 上看到了一个帖子,并照做了。
这是我的 MKTileOverlay 子类:
#import "DETileOverlay.h"
@implementation DETileOverlay
- (void)loadTileAtPath:(MKTileOverlayPath)path
result:(void (^)(NSData *data, NSError *error))result
{
if (!result)
{
return;
}
NSData *cachedData = [self.cache objectForKey:[self URLForTilePath:path]];
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) {
result(data, connectionError);
}];
}
}
@end
然后我像这样使用它:
#import "DETileOverlay.h"
@interface DEMapViewController : UIViewController <MKMapViewDelegate> {
}
@property (nonatomic, retain) DETileOverlay *overlay;
-(void)viewDidLoad {
[super viewDidLoad];
self.overlay = [[DETileOverlay alloc] initWithURLTemplate:@"http://tile.stamen.com/watercolor/{z}/{x}/{y}.jpg"];
self.overlay.canReplaceMapContent = YES;
self.overlay.mapView = map;
[map addOverlay:self.overlay level:MKOverlayLevelAboveLabels];
}
// iOS 7
- (MKOverlayRenderer *)mapView:(MKMapView *)mapView rendererForOverlay:(id <MKOverlay>)ovl
{
MKTileOverlayRenderer *renderer = [[MKTileOverlayRenderer alloc]initWithOverlay:ovl];
return renderer;
}
- (void) mapView:(MKMapView *)mapView
didUpdateUserLocation:(MKUserLocation *)userLocation
{
MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance(userLocation.location.coordinate, 300, 300);
[map setRegion:region animated:YES];
}
当我启动我的应用程序时,没有加载任何图块。如果我不覆盖我的子类中的 loadTileAtPath 一切正常。我做错了什么?
非常感谢。
【问题讨论】:
-
您是否在
loadTileAtPath:result:中设置了断点并检查是否一切正常?数据提取是否有效? -
我实际上是这样做的,看起来他总是进入“else”块并尝试通过 NSURLConnection 加载图块。所以问题是为什么他没有正确加载图块,以及为什么他不缓存图块......
-
后续问题: 1、数据下载成功了吗? 2. 下载的数据缓存在哪里?
-
我刚刚从请求中记录了 nsurl,所以这完全没问题。我只是不明白为什么瓷砖没有被加载,因为网址是完全正确的。切片通过 ' [self.cache setObject: data forKey: [self URLForTilePath:path]]; 保存到缓存' 抱歉,我忘了把它包含在我最初的问题中。
-
data 也不是 nil,connectionError 是 nil。我无法解释为什么瓷砖加载不起作用...
标签: ios iphone mkmapview subclass mktileoverlay