It can be difficult to tell when the app is in progress of downloading map tiles
for offline use, especially when hitting a slow server like USGS or on a slow
network. Adds a download circle icon to indicate download progress to the
user. Also helpfully informs when a zoom level is outside the range.
Previously a map tile cache miss would cause 2x loading of the tile: once from
the remote tile server (which is then written to disk) and once from disk
during the default MKTileOverlay.loadTile function. Instead we now directly
implement loadTile so that we can avoid the duplicate loading and simply
return the fetched remote tile after it is cached, which leads to a
noticeable improvement in offline map performance.
The url returned by MKTileOverlay.url(forTilePath:) is subsequently used by
MKTileOverlay.loadTile(at:result:) for download. In the case of a tile that
was just cached by OfflineTileManager.persistLocally(path:) we now return
the local file URL to avoid downloading the remote image twice.