mapview how current content ios swift uiimage mapkit

ios - how - UIImage(contentsOfFile:) devuelve nil a pesar del archivo existente en el directorio de cachés



uiimageview content mode (1)

El problema es que está usando la propiedad URL absoluteString donde debería estar usando la propiedad de ruta. La diferencia entre absoluteString y las propiedades de path es que absoluteString incluye el esquema de URL del archivo ("file: //"), que es la razón por la que no encuentra el archivo en lo que se suponía que era su ruta, pero en realidad es su absoluteString.

Estoy tratando de guardar una instantánea de un mapa con una superposición en el directorio de cachés y recuperarlo cuando exista. Sin embargo, a pesar del archivo creado, UIImage (contentsOfFile :) devuelve nil cuando intento recuperarlo. Imprimí las rutas de los archivos para escribir y leer y son iguales y verifiqué que el archivo existe descargando el contenedor y comprobando el directorio y el archivo definitivamente existe.

¿Alguna idea de cuál es el problema aquí?

let cachesDirectory: URL = { let urls = FileManager.default.urls(for: .cachesDirectory, in: .userDomainMask) return urls[urls.endIndex - 1] }() let mapCachesDirectory = cachesDirectory.appendingPathComponent("map-snapshots", isDirectory: true) func configureMap(data: NSSet?) { mapView.isZoomEnabled = false mapView.isScrollEnabled = false mapView.isUserInteractionEnabled = false guard let data = data as? Set<SessionData>, data.count > 0 else { return } activityIndicatorView.isHidden = false activityIndicatorView.startAnimating() DispatchQueue.global(qos: .userInitiated).async { var points = [CLLocationCoordinate2D]() for object in data { guard object.locationLatitude != 0, object.locationLatitude != 0 else { continue } points.append(CLLocationCoordinate2DMake(object.locationLatitude, object.locationLongitude)) } DispatchQueue.main.async(execute: { self.createOverlay(points: points) self.activityIndicatorView.stopAnimating() self.activityIndicatorView.isHidden = true self.cacheMapImage(view: self.mapView) }) } } func cacheMapImage(view: UIView) { UIGraphicsBeginImageContextWithOptions(view.bounds.size, true, 0) view.drawHierarchy(in: view.bounds, afterScreenUpdates: true) let compositeImage = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() DispatchQueue.global(qos: .userInitiated).async { if let compositeImage = compositeImage, let info = self.info { let data = UIImagePNGRepresentation(compositeImage) do { var isDirectory: ObjCBool = false let fileManager = FileManager.default if fileManager.fileExists(atPath: self.mapCachesDirectory.absoluteString, isDirectory: &isDirectory) == false { try fileManager.createDirectory(at: self.mapCachesDirectory, withIntermediateDirectories: true, attributes: nil) } let fileURL = self.mapCachesDirectory.appendingPathComponent(info.uid).appendingPathExtension("png") try data?.write(to: fileURL) print("/(fileURL.absoluteString) Saved") } catch { log.error(error) } } } } func cachedMapImage() -> UIImage? { guard let info = info else { return nil } let filePath = mapCachesDirectory.appendingPathComponent(info.uid).appendingPathExtension("png").absoluteString let image = UIImage(contentsOfFile: filePath) print("/(filePath): /(image)") return image } func createOverlay(points: [CLLocationCoordinate2D]) { guard points.count > 0 else { return } let overlay = MKGeodesicPolyline(coordinates: points, count: points.count) mapView.add(overlay) let inset: CGFloat = 50.0 mapView.setVisibleMapRect(overlay.boundingMapRect, edgePadding: UIEdgeInsetsMake(inset,inset,inset,inset), animated: true) }