UIImage(contentsOfFile:) devuelve nulo a pesar de que el archivo existe en el directorio de cachés [duplicado]

Resuelto doovers asked hace 54 años • 1 respuestas

Estoy intentando guardar una instantánea de un mapa con una superposición en el directorio de cachés y recuperarla cuando exista. Sin embargo, a pesar de que se creó el archivo, UIImage(contentsOfFile:) devuelve cero cuando intento recuperarlo. Imprimí las rutas de los archivos tanto para escritura como para lectura y son las mismas y verifiqué que el archivo existe descargando el contenedor y verificando 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)
}
doovers avatar Jan 01 '70 08:01 doovers
Aceptado

El problema es que estás usando la propiedad de URL absolutString donde deberías usar la propiedad de ruta. La diferencia entre las propiedades absoluteStringy pathes que absolutString incluye el esquema de URL del archivo ("archivo://"), 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 absolutString.

Leo Dabus avatar Nov 16 '2016 21:11 Leo Dabus