Skip to content

Commit b7edd55

Browse files
authored
GroupTileLayer clear child Layer tile cache data when child Layer forceReload (#1989)
1 parent b92211b commit b7edd55

File tree

2 files changed

+50
-1
lines changed

2 files changed

+50
-1
lines changed

src/layer/tile/GroupTileLayer.js

Lines changed: 48 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ const options = {
99

1010

1111
const DEFAULT_TILESIZE = new Size(256, 256);
12-
const EVENTS = 'show hide remove setzindex';
12+
const EVENTS = 'show hide remove setzindex forcereloadstart';
1313

1414
function checkLayers(tileLayers) {
1515
if (!Array.isArray(tileLayers)) {
@@ -238,6 +238,49 @@ class GroupTileLayer extends TileLayer {
238238
return null;
239239
}
240240

241+
_removeChildTileCache(layer) {
242+
if (!layer) {
243+
return this;
244+
}
245+
const renderer = this.getRenderer();
246+
if (!renderer) {
247+
return this;
248+
}
249+
let cache;
250+
const id = layer.getId();
251+
const validateCache = () => {
252+
return cache && cache.info && cache.info.layer === id;
253+
};
254+
//clear LRU
255+
if (renderer.tileCache) {
256+
const keys = renderer.tileCache.keys();
257+
keys.forEach(key => {
258+
cache = renderer.tileCache.get(key);
259+
if (validateCache()) {
260+
renderer.tileCache.remove(key);
261+
}
262+
});
263+
}
264+
//clear tilesInView cache
265+
const tilesInView = renderer.tilesInView || {};
266+
for (const key in tilesInView) {
267+
cache = tilesInView[key];
268+
if (validateCache()) {
269+
delete tilesInView[key];
270+
}
271+
}
272+
//cancel image load
273+
const tilesLoading = renderer.tilesLoading || {};
274+
for (const key in tilesLoading) {
275+
cache = tilesLoading[key];
276+
if (validateCache()) {
277+
renderer.abortTileLoading(cache.image);
278+
delete tilesLoading[key];
279+
}
280+
}
281+
return this;
282+
}
283+
241284
_onLayerShowHide(e) {
242285
const { type, target } = e || {};
243286
//listen tilelayer.remove() method fix #1629
@@ -248,6 +291,8 @@ class GroupTileLayer extends TileLayer {
248291
this._refresh();
249292
} else if (type === 'setzindex') {
250293
this._sortLayers();
294+
} else if (type === 'forcereloadstart') {
295+
this._removeChildTileCache(target);
251296
}
252297
this._renderLayers();
253298
return this;
@@ -275,6 +320,8 @@ class GroupTileLayer extends TileLayer {
275320
if (!layer.getMap()) {
276321
layer._bindMap(map);
277322
}
323+
//remove old event handler
324+
layer.off(EVENTS, this._onLayerShowHide, this);
278325
layer.on(EVENTS, this._onLayerShowHide, this);
279326
});
280327
return this;

src/layer/tile/TileLayer.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -201,8 +201,10 @@ class TileLayer extends Layer {
201201
* @return {TileLayer} this
202202
*/
203203
forceReload() {
204+
this.fire('forcereloadstart');
204205
this.clear();
205206
this.load();
207+
this.fire('forcereloadend');
206208
return this;
207209
}
208210

0 commit comments

Comments
 (0)