Ios MKTilelOverlay中的NSCache

Ios MKTilelOverlay中的NSCache,ios,objective-c,nscache,mktileoverlay,Ios,Objective C,Nscache,Mktileoverlay,我正在尝试将NSCache添加到我的子类MKTileOverlay类: @interface WMSTileOverlay () @property NSCache *cache; @end @implementation WMSTileOverlay -(instancetype)initWithURLTemplate:(NSString *)URLTemplate { self = [super initWithURLTemplate:URLTemplate]; i

我正在尝试将
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
DEBUG |-[WMSTileOverlay initWithMapContext:andLayer:]|原始self.cache:
调试|(u40-[WMSTileOverlay loadTileAtPath:result:][u block_invoke |为磁贴服务向缓存添加数据=wms&version=1.1.1&request=GetMap&SRS=EPSG:4326&layers=displayimg&mode=tiled&tile=30295+46150+17&format=image/png&transparent=true
调试| | U 40-[WMSTileOverlay loadTileAtPath:result:][U块|调用|缓存:
DEBUG | | uuu40-[WMSTileOverlay loadTileAtPath:result:][u block | u invoke |找到url路径的数据

这是因为一旦加载了特定路径的磁贴,MapKit就不会在同一会话中再次为该路径调用loadTileAtPath,我认为MapKit已经以某种方式在内部缓存了加载的磁贴。

您确定
connectionError
否?也许
数据
nil
。您是否调用
loadTileAtPath
太频繁,并且在同一资产的下一个请求通过之前不让
sendAsynchronousRequest
响应?数据不是零,我在地图上看到了加载的磁贴。您确定调用了初始化器吗?是否可能从未创建缓存,因此不会发生命中?您可以尝试通过在setObject周围添加日志行来确保缓存已正确更改:。。。callYes,我确定正在调用初始值设定项。我还添加了一个IF语句,以查看数据是否实际添加到缓存中,并且是否正确。我一加上它就找到了。我想知道MKTileOverlay是否有自己的缓存系统。当我缩小并返回时,它并不总是重新获取互动程序,但由于互动程序的图像,我无法100%地判断它是正确的缩放级别互动程序还是从较低的缩放级别(缩放编号越低,您被进一步放大)放大的互动程序。我认为您是正确的。我注意到,如果应用程序长时间处于空闲状态,如果我再次移动地图,它将从缓存加载磁贴。我假设在X时间之后,MapKit会清除其缓存,然后在我的缓存中找到磁贴。