2016-11-16 8 views
6

मैं कैश निर्देशिका में ओवरले के साथ एक मानचित्र का एक स्नैपशॉट सहेजने की कोशिश कर रहा हूं और यह मौजूद होने पर इसे पुनर्प्राप्त कर रहा हूं। हालांकि, फ़ाइल बनाने के बावजूद, UIImage (contentOfFile :) जब मैं इसे पुनर्प्राप्त करने का प्रयास करता हूं तो शून्य वापस आता है। मैंने दोनों लिखने और पढ़ने के लिए फ़ाइल पथ मुद्रित किए हैं और वे वही हैं और फ़ाइल को कंटेनर डाउनलोड करके और निर्देशिका की जांच करके मौजूद है और फ़ाइल निश्चित रूप से मौजूद है।UIImage (contentOfFile :) कैश निर्देशिका में मौजूद फ़ाइल के बावजूद शून्य वापस लौटना

कोई विचार यह है कि समस्या क्या है?

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

पूर्ण स्ट्रिंग और पथ गुणों के बीच अंतर यह है कि पूर्ण स्ट्रिंग में यूआरएल योजना शामिल है, इस मामले में "फ़ाइल: //" जिस कारण से फ़ाइल को यह नहीं मिला है, उसका पथ होना चाहिए था, लेकिन वास्तव में यह इसके पूर्ण स्ट्रिंग –

+1

@LeoDabus उत्कृष्ट था जो समस्या थी। यदि आप एक उत्तर जोड़ना चाहते हैं तो मैं हल किए गए प्रश्न को चिह्नित कर सकता हूं। धन्यवाद! – doovers

उत्तर

13

समस्या यह है कि आप यूआरएल संपत्ति absoluteString का उपयोग कर रहे हैं जहां आपको पथ संपत्ति का उपयोग करना चाहिए। absoluteString and पथ गुणों के बीच का अंतर यह है कि पूर्ण स्ट्रिंग में फ़ाइल यूआरएल योजना ("फ़ाइल: //") शामिल है, यही वजह है कि फ़ाइल को उसके पथ के रूप में नहीं माना जाता है, लेकिन यह वास्तव में इसका पूर्ण स्ट्रिंग है।

संबंधित मुद्दे