NSCache в MKTilelOverlay

Я пытаюсь добавить NSCache на мой подкласс 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);
        }
    }];
}

}

Но я никогда не вижу, чтобы плитка извлекалась из кэша (я никогда не вижу сообщения журнала "Cache Tile Found!!!!!!").

Что я могу делать не так?

РЕДАКТИРОВАТЬ: я добавил в информацию журнала

Я добавил в кучу регистрации. Я проверяю, создан ли кеш и является ли он тем же кешем, на который я ссылаюсь, чтобы найти плитку. Я также проверяю, были ли данные добавлены в кеш и найдены ли они сразу после добавления:

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

1 ответ

Это потому, что как только плитка для определенного пути загружена, MapKit больше не будет вызывать loadTileAtPath для этого пути в том же сеансе, я думаю, MapKit каким-то образом уже кэшировал загруженные плитки внутри.

Другие вопросы по тегам