NSCache
サブクラスクラスに a を追加しようとしていMKTileOverlay
ます:
@interface WMSTileOverlay ()
@property NSCache *cache;
@end
@implementation WMSTileOverlay
-(instancetype)initWithURLTemplate:(NSString *)URLTemplate {
self = [super initWithURLTemplate:URLTemplate];
if (self) {
DLog(@"setting cache");
self.cache = [[NSCache alloc] init];
DLog(@"original self.cache: %@", self.cache);
}
return self;
}
-(void)loadTileAtPath:(MKTileOverlayPath)path result:(void (^)(NSData *, NSError *))result {
if (!result) {
return;
}
NSData *cachedData = [self.cache objectForKey:[self URLForTilePath:path]];
if (cachedData) {
DLog(@"Cached tile found!!!!!!!");
result(cachedData, nil);
} else {
NSURLRequest *request = [NSURLRequest requestWithURL:[self URLForTilePath:path]];
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
if (connectionError) {
result (nil, connectionError);
}
else {
DLog(@"adding data to cache for tile %@", [self URLForTilePath:path]);
DLog(@"cache: %@", self.cache);
[self.cache setObject:data forKey:[self URLForTilePath:path]];
if ([self.cache objectForKey:[self URLForTilePath:path]]) {
DLog(@"found the data for url path");
}
result (data, nil);
}
}];
}
}
しかし、キャッシュからタイルがフェッチされることはありません (「キャッシュ タイルが見つかりました!!!!!!」というログ メッセージが表示されることはありません)。
私は何を間違っているのでしょうか?
編集:ログ情報を追加しました
たくさんのログを追加しました。キャッシュが作成されたかどうか、およびタイルを見つけるために参照したのと同じキャッシュであることを確認します。また、データがキャッシュに追加されたかどうかを確認し、追加した直後に見つかりました。
DEBUG | -[WMSTileOverlay initWithMapContext:andLayer:] | original self.cache: <NSCache: 0x1bf59e10>
DEBUG | __40-[WMSTileOverlay loadTileAtPath:result:]_block_invoke | adding data to cache for tile service=wms&version=1.1.1&request=GetMap&SRS=EPSG:4326&layers=displayimg&mode=tiled&tile=30295+46150+17&format=image/png&transparent=true
DEBUG | __40-[WMSTileOverlay loadTileAtPath:result:]_block_invoke | cache: <NSCache: 0x1bf59e10>
DEBUG | __40-[WMSTileOverlay loadTileAtPath:result:]_block_invoke | found the data for url path