2016-09-14 9 views
14

मैं एक्सकोड 8.0 और स्विफ्ट 3.0 के साथ अलामोफ़ीयर 4.0.0 का उपयोग करके अपने कोड में this picture डाउनलोड करने का प्रयास कर रहा हूं।अलामोफायर डाउनलोड समस्या

यहाँ मेरा अनुरोध है:

func download(_ path: String, _ completionHandler: @escaping (Any?) ->()) { 
     let stringURL = "https://slove.tulleb.com/uploads/6/6/0/2/66027561/2791411.jpg-1447979839.png" 

     print("Requesting \(stringURL)...") 

     _ = Alamofire.download(stringURL) 
      .responseData { response in 
       print(response) 

       if let data = response.result.value { 
        completionHandler(UIImage(data: data)) 
       } else { 
        completionHandler(nil) 
       } 
     } 
    } 

मैं सर्वर से निम्नलिखित जवाब पाने:

विफलता: responseSerializationFailed (Alamofire.AFError.ResponseSerializationFailureReason.inputFileReadFailed (file: /// निजी /var/mobile/Containers/Data/Application/50400F41-47FD-4276-8903-F48D942D064A/tmp/CFNetworkDownload_D1Aqkh.tmp))

मुझे इस बारे में कोई जानकारी नहीं है कि इसे कैसे ठीक किया जाए ... क्या अलामोफायर के नए संस्करण में कुछ समस्याएं हैं या क्या मैं कहीं कहीं भूल रहा हूं?

धन्यवाद!

उत्तर

18

Official answer from cnoon (Alamofire member):

हाय @Tulleb, आपसे जल्दी ही नहीं मिल रहा है के लिए

क्षमा याचना। उदाहरण @ katopz एक ही प्रकार का अनुरोध नहीं है। यह उदाहरण दिखाता है कि डेटा कार्य का उपयोग कैसे करें, डाउनलोड कार्य नहीं। आप फ़ाइल डाउनलोड करने के लिए नहीं करना चाहते हैं, आप के बजाय निम्न कर सकते हैं:

Alamofire.request(url).responseData { response in 
    guard let data = response.result.value else { return } 
    let image = UIImage(data: data) 
    print(image) 
} 

हालांकि, जवाब देने के लिए आप मूल प्रश्न कर रहे हैं, अगर आप एकसैंडबॉक्स अनुमतियाँ मुद्दे में चला रहे हैं। हम आपको डाउनलोड एपीआई का उपयोग करने के लिए ऑपरेटिंग के लिए गंतव्य बंद करने के बिना मैकोज़ जैसे सिस्टम बंद करने की अनुमति देते हैं, जहां आप अपने सैंडबॉक्स के बाहर फ़ाइलों तक पहुंच सकते हैं। हालांकि, आईओएस पर, आप अपने सैंडबॉक्स के बाहर फ़ाइल के डेटा तक सीधे पहुंच नहीं सकते हैं। यही कारण है कि आप देख रहे हैं .inputFileReadFailed त्रुटि।

इस मुद्दे को हल करने के कुछ तरीके हैं।

विकल्प 1

आप अनुरोध एपीआई का उपयोग कर डेटा के रूप में दिखाया गया है जो ऊपर , स्मृति में छवि डेटा डाउनलोड करता है डिस्क के लिए नहीं डाउनलोड कर सकते हैं।

विकल्प 2

आप डेटा तक पहुँचने एक गंतव्य बंद उपयोग करने से पहले अपने सैंडबॉक्स में फ़ाइल स्थानांतरित कर सकते हैं।

let destination: DownloadRequest.DownloadFileDestination = { _, _ in 
let documentsPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, 
.userDomainMask, true)[0] 
let documentsURL = URL(fileURLWithPath: documentsPath, isDirectory: true) 
let fileURL = documentsURL.appendingPathComponent("image.png") 

return (fileURL, [.removePreviousFile, .createIntermediateDirectories]) } 

Alamofire.download("https://httpbin.org/image/png", to: 
destination).responseData { response in 
    debugPrint(response) 

    if let data = response.result.value { 
     let image = UIImage(data: data) 
     print(image) 
    } else { 
     print("Data was invalid") 
    } 
} 

// आउटपुट:

// [अनुरोध]: https://httpbin.org/image/png // [प्रतिक्रिया]: यहाँ है कि कैसे करना है, इसका एक उदाहरण {URL: https://httpbin.org/image/png } {स्थिति कोड: 200, शीर्षलेख {// "एक्सेस-कंट्रोल-अनुमति-उत्पत्ति" = "*"; // "सामग्री-लंबाई" = 80 9 0; // "सामग्री-प्रकार" = "छवि/पीएनजी"; // तिथि = "शनि, 24 सितंबर 2016 21:34:25 जीएमटी"; //
सर्वर = nginx; // "पहुंच-नियंत्रण-अनुमति-प्रमाण-पत्र" = सत्य; //} } // [TemporaryURL]: /private/var/mobile/Containers/Data/Application/25612024-9A05-4ED5-AF3B-A98E22DEAD7A/tmp/CFNetworkDownload_fD9sXf.tmp // [destinationUrl]: /var /mobile/Containers/Data/Aplication/25612024-9A05-4ED5-AF3B-A98E22DEAD7A/Documents/image.png // [ResumeData]: 0 बाइट // [परिणाम]: सफलता: 80 9 0 बाइट // [टाइमलाइन]: समयरेखा: {"अनुरोध प्रारंभ समय": 496445664.792, "प्रारंभिक प्रतिक्रिया समय": 496445665.651, "पूर्ण समय का अनुरोध करें": 496445665.655, "सीरियलाइजेशन पूर्ण समय": 496445665.655, "लेटेंसी": 0.860 सेकंड, "अनुरोध अवधि": 0.863 सेक, "सीरियलाइजेशन अवधि": 0.000 सेकेंड, "कुल अवधि": 0.864 सेकंड} // वैकल्पिक (, {100, 100}) आपको 012 का उपयोग करना होगा यदि आपको डिस्क पर फ़ाइल डाउनलोड करने की आवश्यकता है तोगंतव्य बंद करें। अस्थायी फ़ाइल केवल प्रतिनिधि कॉलबैक के अंदर पहुंचा जा सकता है जो को आंतरिक रूप से अलामोफ़ीयर में संभाला जाता है। यदि आप आईओएस पर गंतव्य बंद नहीं करते हैं, तो अस्थायी URL हमेशा पर इंगित करेगा जहां अस्थायी फ़ाइल पहले संग्रहीत की गई थी, लेकिन इसे साफ़ कर दिया गया है।

सारांश

सारांश में

तो, आप, डिस्क पर डेटा डाउनलोड करने के लिए तो आप विकल्प 1. चाहते हैं, डिस्क पर फ़ाइल सहेजना चाहते हैं तो आप विकल्प 2 चाहते हैं, तो जरूरत नहीं है अगर

चीयर्स।

+0

बहुत स्पष्ट उत्तर, बहुत बहुत धन्यवाद। – Adagio

+0

मैं एक ही मुद्दे पर चल रहा था। जवाब के लिए धन्यवाद! – user30646

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