2016-11-16 36 views
6

我試圖在緩存目錄中使用覆蓋保存地圖的快照,並在存在時檢索它。但是,儘管創建了文件,但當我嘗試檢索文件時,UIImage(contentsOfFile :)返回nil。我已經打印了寫入和讀取的文件路徑,它們是相同的,並通過下載容器並檢查目錄和文件確實存在來驗證文件是否存在。UIImage(contentsOfFile :)返回nil,儘管文件存在於緩存目錄中

任何想法這裏的問題是什麼?

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) 
} 
+1

'atPath:self.mapCachesDirectory.absoluteString'應該是'atPath:self.mapCachesDirectory.path' –

+0

absoluteString和路徑屬性的區別在於absoluteString包含了url方案,在本例中是「file://」,它是它沒有找到該文件的原因應該是它的路徑,但它實際上是它的absoluteString –

+1

@LeoDabus優秀的是這個問題。如果你想添加一個答案,我可以標記問題解決。謝謝! – doovers

回答

13

問題在於您正在使用URL屬性absoluteString,您應該使用路徑屬性。 absoluteString and路徑屬性之間的區別在於,absoluteString包含文件url方案(「file://」),這是它沒有在應該是其路徑的地方找到文件的原因,但實際上它是它的絕對字符串。

相關問題