दिलचस्प पोस्ट
अजगर स्क्रिप्ट शेड्यूल करें – विंडोज 7 "Java-server" और "java -client" के बीच वास्तविक मतभेद? स्ट्रिंग को XML दस्तावेज़ में कन्वर्ट करें आईओएस 7.0 और सिस्टम डिग्रेडेशन के तहत अमान्य संदर्भ 0x0 फ़ंक्शन के मॉड्यूल को पायथन में कॉल करने के __name__ प्राप्त करें jQuery का आकार परिवर्तन फ़ंक्शन पृष्ठ लोड पर काम नहीं करता आईआईएस 7.0 के अंतर्गत क्लासिक एएसपी एप्लीकेशन काम करने के लिए मार्गदर्शन कैसे करें I गंभीर त्रुटि: वैकल्पिक मानों को खोलते हुए अनपेक्षित रूप से शून्य पाया गया उद्देश्य-सी एकाधिक वंशानुक्रम IPython नोटबुक matplotlib प्लॉट इनलाइन कैसे करें इस मामले में एलिसप स्थानीय वैरिएबल का मूल्य क्यों रखता है? मैं Pythons समय के साथ प्रदर्शन के परीक्षण के लिए एक कोड खंड कैसे कर सकता हूँ? मैं नाम या प्रकार से WPF नियंत्रण कैसे पा सकता हूं? Android में नया Google साइन इन पीएचपी अनुप्रयोगों में मल्टी थ्रेडिंग का उपयोग कैसे किया जा सकता है

फ़ाइल को स्विफ्ट में कैसे डाउनलोड करें?

मैं सिर्फ एंड्रॉइड से आईओएस के लिए एप्पल स्विफ्ट प्रोग्रामिंग सीखना शुरू कर दिया। मैं मूल रूप से अब तेजी से पढ़ सकता हूं और हेरफेर करता हूं और आईओएस स्विफ्ट प्रोग्रामिंग में इस्तेमाल होने वाले कुछ सामान्य वर्गों को भी सीखा है, लेकिन अभी भी सिंटैक्स और सब कुछ के साथ कुछ भ्रम हो रहा है।

मैं फ़ाइल डाउनलोड करने का प्रयास कर रहा हूं जैसे, इस यूआरएल से आकर कहें

var url = "http://www.mywebsite.com/myfile.pdf" 

एक बटन क्लिक में शायद दृश्य प्रगति के साथ भी

स्टैकरहोवरफ्लो में यहां खोज के माध्यम से, मैं अलामफर पर ठोकर खाई। मैं यह कोशिश कर सकता हूं लेकिन मुझे यकीन नहीं है कि यह मेरे लिए यह सबसे अच्छा तरीका है।

इसलिए, मैं यह पूछना चाहूंगा कि मेरे लक्ष्य को कैसे प्राप्त करने में मेरे विकल्प (आईओएस 7 और आईओएस 8) और क्या हैं I इसके अलावा, पेशेवर और विपक्ष भयानक होगा!

वेब के समाधान से एकत्रित समाधान "फ़ाइल को स्विफ्ट में कैसे डाउनलोड करें?"

अलामफिर के बिना उदाहरण डाउनलोडर वर्ग:

 class Downloader { class func load(URL: NSURL) { let sessionConfig = NSURLSessionConfiguration.defaultSessionConfiguration() let session = NSURLSession(configuration: sessionConfig, delegate: nil, delegateQueue: nil) let request = NSMutableURLRequest(URL: URL) request.HTTPMethod = "GET" let task = session.dataTaskWithRequest(request, completionHandler: { (data: NSData!, response: NSURLResponse!, error: NSError!) -> Void in if (error == nil) { // Success let statusCode = (response as NSHTTPURLResponse).statusCode println("Success: \(statusCode)") // This is your file-variable: // data } else { // Failure println("Failure: %@", error.localizedDescription); } }) task.resume() } } 

यह आपके अपने कोड में इसका उपयोग कैसे करें:

 class Foo { func bar() { if var URL = NSURL(string: "http://www.mywebsite.com/myfile.pdf") { Downloader.load(URL) } } } 

स्विफ्ट 3 संस्करण

इसके बजाय स्मृति में बजाय बड़ी डिस्क डाउनलोड करने के लिए नोट करें `डाउनलोड टास्क देखें:

 class Downloader { class func load(url: URL, to localUrl: URL, completion: @escaping () -> ()) { let sessionConfig = URLSessionConfiguration.default let session = URLSession(configuration: sessionConfig) let request = try! URLRequest(url: url, method: .get) let task = session.downloadTask(with: request) { (tempLocalUrl, response, error) in if let tempLocalUrl = tempLocalUrl, error == nil { // Success if let statusCode = (response as? HTTPURLResponse)?.statusCode { print("Success: \(statusCode)") } do { try FileManager.default.copyItem(at: tempLocalUrl, to: localUrl) completion() } catch (let writeError) { print("error writing file \(localUrl) : \(writeError)") } } else { print("Failure: %@", error?.localizedDescription); } } task.resume() } } 

यहां एक उदाहरण दिया गया है जो दिखाता है कि कैसे समन्वयन और async करें

 import Foundation class HttpDownloader { class func loadFileSync(url: NSURL, completion:(path:String, error:NSError!) -> Void) { let documentsUrl = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask).first as! NSURL let destinationUrl = documentsUrl.URLByAppendingPathComponent(url.lastPathComponent!) if NSFileManager().fileExistsAtPath(destinationUrl.path!) { println("file already exists [\(destinationUrl.path!)]") completion(path: destinationUrl.path!, error:nil) } else if let dataFromURL = NSData(contentsOfURL: url){ if dataFromURL.writeToURL(destinationUrl, atomically: true) { println("file saved [\(destinationUrl.path!)]") completion(path: destinationUrl.path!, error:nil) } else { println("error saving file") let error = NSError(domain:"Error saving file", code:1001, userInfo:nil) completion(path: destinationUrl.path!, error:error) } } else { let error = NSError(domain:"Error downloading file", code:1002, userInfo:nil) completion(path: destinationUrl.path!, error:error) } } class func loadFileAsync(url: NSURL, completion:(path:String, error:NSError!) -> Void) { let documentsUrl = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask).first as! NSURL let destinationUrl = documentsUrl.URLByAppendingPathComponent(url.lastPathComponent!) if NSFileManager().fileExistsAtPath(destinationUrl.path!) { println("file already exists [\(destinationUrl.path!)]") completion(path: destinationUrl.path!, error:nil) } else { let sessionConfig = NSURLSessionConfiguration.defaultSessionConfiguration() let session = NSURLSession(configuration: sessionConfig, delegate: nil, delegateQueue: nil) let request = NSMutableURLRequest(URL: url) request.HTTPMethod = "GET" let task = session.dataTaskWithRequest(request, completionHandler: { (data: NSData!, response: NSURLResponse!, error: NSError!) -> Void in if (error == nil) { if let response = response as? NSHTTPURLResponse { println("response=\(response)") if response.statusCode == 200 { if data.writeToURL(destinationUrl, atomically: true) { println("file saved [\(destinationUrl.path!)]") completion(path: destinationUrl.path!, error:error) } else { println("error saving file") let error = NSError(domain:"Error saving file", code:1001, userInfo:nil) completion(path: destinationUrl.path!, error:error) } } } } else { println("Failure: \(error.localizedDescription)"); completion(path: destinationUrl.path!, error:error) } }) task.resume() } } } 

अपने कोड में इसका उपयोग कैसे करें:

 let url = NSURL(string: "http://www.mywebsite.com/myfile.pdf") HttpDownloader.loadFileAsync(url, completion:{(path:String, error:NSError!) in println("pdf downloaded to: \(path)") }) 

जब तक आपका एप्लिकेशन अग्रभूमि में है तब तक देवानन और डीजूनोड के समाधान काम कर रहे हैं यदि आप डाउनलोड के दौरान किसी अन्य एप्लिकेशन पर स्विच करते हैं, तो यह विफल हो जाता है। मेरी फ़ाइल आकार लगभग 10 एमबी है और इसे डाउनलोड करने में कुछ समय लगता है। तो मुझे अपने डाउनलोड समारोह की आवश्यकता होती है, भले ही ऐप पृष्ठभूमि में हो।

कृपया ध्यान दें कि मैंने "क्षमताओं" पर "पृष्ठभूमि मोड / पृष्ठभूमि प्राप्त" पर स्विच किया है।

पूरा होने के बाद से सदन का समर्थन नहीं किया गया था, इसका समाधान समझाया नहीं गया है। उसके लिए माफ़ करना।

– स्विफ्ट 2.3 –

 import Foundation class Downloader : NSObject, NSURLSessionDownloadDelegate { var url : NSURL? // will be used to do whatever is needed once download is complete var yourOwnObject : NSObject? init(yourOwnObject : NSObject) { self.yourOwnObject = yourOwnObject } //is called once the download is complete func URLSession(session: NSURLSession, downloadTask: NSURLSessionDownloadTask, didFinishDownloadingToURL location: NSURL) { //copy downloaded data to your documents directory with same names as source file let documentsUrl = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask).first let destinationUrl = documentsUrl!.URLByAppendingPathComponent(url!.lastPathComponent!) let dataFromURL = NSData(contentsOfURL: location) dataFromURL?.writeToURL(destinationUrl, atomically: true) //now it is time to do what is needed to be done after the download yourOwnObject!.callWhatIsNeeded() } //this is to track progress func URLSession(session: NSURLSession, downloadTask: NSURLSessionDownloadTask, didWriteData bytesWritten: Int64, totalBytesWritten: Int64, totalBytesExpectedToWrite: Int64) { } // if there is an error during download this will be called func URLSession(session: NSURLSession, task: NSURLSessionTask, didCompleteWithError error: NSError?) { if(error != nil) { //handle the error print("Download completed with error: \(error!.localizedDescription)"); } } //method to be called to download func download(url: NSURL) { self.url = url //download identifier can be customized. I used the "ulr.absoluteString" let sessionConfig = NSURLSessionConfiguration.backgroundSessionConfigurationWithIdentifier(url.absoluteString) let session = NSURLSession(configuration: sessionConfig, delegate: self, delegateQueue: nil) let task = session.downloadTaskWithURL(url) task.resume() } } 

और यहां कॉल करने के लिए – स्विस 2.3 –

  let url = NSURL(string: "http://company.com/file.txt") Downloader(yourOwnObject).download(url!) 

–स्विफ़्ट 3 –

 class Downloader : NSObject, URLSessionDownloadDelegate { var url : URL? // will be used to do whatever is needed once download is complete var yourOwnObject : NSObject? init(_ yourOwnObject : NSObject) { self.yourOwnObject = yourOwnObject } //is called once the download is complete func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didFinishDownloadingTo location: URL) { //copy downloaded data to your documents directory with same names as source file let documentsUrl = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first let destinationUrl = documentsUrl!.appendingPathComponent(url!.lastPathComponent) let dataFromURL = NSData(contentsOf: location) dataFromURL?.write(to: destinationUrl, atomically: true) //now it is time to do what is needed to be done after the download yourOwnObject!.callWhatIsNeeded() } //this is to track progress private func URLSession(session: URLSession, downloadTask: URLSessionDownloadTask, didWriteData bytesWritten: Int64, totalBytesWritten: Int64, totalBytesExpectedToWrite: Int64) { } // if there is an error during download this will be called func urlSession(_ session: URLSession, task: URLSessionTask, didCompleteWithError error: Error?) { if(error != nil) { //handle the error print("Download completed with error: \(error!.localizedDescription)"); } } //method to be called to download func download(url: URL) { self.url = url //download identifier can be customized. I used the "ulr.absoluteString" let sessionConfig = URLSessionConfiguration.background(withIdentifier: url.absoluteString) let session = Foundation.URLSession(configuration: sessionConfig, delegate: self, delegateQueue: nil) let task = session.downloadTask(with: url) task.resume() }} 

और यहां कॉल करने के लिए – स्विस 3 –

  let url = URL(string: "http://company.com/file.txt") Downloader(yourOwnObject).download(url!) 

यदि आपको String में केवल पाठ फ़ाइल डाउनलोड करने की आवश्यकता है तो आप इस सरल तरीके से उपयोग कर सकते हैं, स्विफ्ट 3 :

 let list = try? String(contentsOf: URL(string: "https://example.com/file.txt")!) 

यदि आप गैर वैकल्पिक परिणाम या त्रुटि से निपटने चाहते हैं:

 do { let list = try String(contentsOf: URL(string: "https://example.com/file.txt")!) } catch { // Handle error here } 

आपको पता होना चाहिए कि नेटवर्क ऑपरेशन को कुछ समय लग सकता है, इसे मुख्य थ्रेड में चलने से रोकने और अपना UI लॉक करने के लिए, आप कोड को अतुल्यकालिक निष्पादित कर सकते हैं, उदाहरण के लिए:

 DispatchQueue.global().async { let list = try? String(contentsOf: URL(string: "https://example.com/file.txt")!) } 

यह कोड केवल स्विफ्ट 3.0 पर आज़माएं। पहले एनएस ऑब्जेक्ट फ़ाइल बनाएं इस कोड को बनाई गई फ़ाइल में कॉपी करें

 import UIKit class Downloader : NSObject, URLSessionDownloadDelegate { var url : URL? // will be used to do whatever is needed once download is complete var obj1 : NSObject? init(_ obj1 : NSObject) { self.obj1 = obj1 } //is called once the download is complete func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didFinishDownloadingTo location: URL) { //copy downloaded data to your documents directory with same names as source file let documentsUrl = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first let destinationUrl = documentsUrl!.appendingPathComponent(url!.lastPathComponent) let dataFromURL = NSData(contentsOf: location) dataFromURL?.write(to: destinationUrl, atomically: true) //now it is time to do what is needed to be done after the download //obj1!.callWhatIsNeeded() } //this is to track progress private func URLSession(session: URLSession, downloadTask: URLSessionDownloadTask, didWriteData bytesWritten: Int64, totalBytesWritten: Int64, totalBytesExpectedToWrite: Int64) { } // if there is an error during download this will be called func urlSession(_ session: URLSession, task: URLSessionTask, didCompleteWithError error: Error?) { if(error != nil) { //handle the error print("Download completed with error: \(error!.localizedDescription)"); } } //method to be called to download func download(url: URL) { self.url = url //download identifier can be customized. I used the "ulr.absoluteString" let sessionConfig = URLSessionConfiguration.background(withIdentifier: url.absoluteString) let session = Foundation.URLSession(configuration: sessionConfig, delegate: self, delegateQueue: nil) let task = session.downloadTask(with: url) task.resume() }} 

तो नीचे कोड की प्रतिलिपि करें और आप के स्थान पर कोड डालकर फ़ाइल डाउनलोड करना चाहते हैं

  object = "http://www.mywebsite.com/myfile.pdf" let url1 = URL(string: object!) Downloader(url1! as NSObject).download(url: url1!) 

स्विफ्ट 3

आप काटने के द्वारा फ़ाइल काटने डाउनलोड करना चाहते हैं और प्रगति दृश्य में दिखाना चाहते हैं ताकि आप इस कोड को आज़माना चाहते हैं

 import UIKit class ViewController: UIViewController,URLSessionDownloadDelegate,UIDocumentInteractionControllerDelegate { @IBOutlet weak var img: UIImageView! @IBOutlet weak var btndown: UIButton! var urlLink: URL! var defaultSession: URLSession! var downloadTask: URLSessionDownloadTask! //var backgroundSession: URLSession! @IBOutlet weak var progress: UIProgressView! override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. let backgroundSessionConfiguration = URLSessionConfiguration.background(withIdentifier: "backgroundSession") defaultSession = Foundation.URLSession(configuration: backgroundSessionConfiguration, delegate: self, delegateQueue: OperationQueue.main) progress.setProgress(0.0, animated: false) } func startDownloading () { let url = URL(string: "http://publications.gbdirect.co.uk/c_book/thecbook.pdf")! downloadTask = defaultSession.downloadTask(with: url) downloadTask.resume() } @IBAction func btndown(_ sender: UIButton) { startDownloading() } func showFileWithPath(path: String){ let isFileFound:Bool? = FileManager.default.fileExists(atPath: path) if isFileFound == true{ let viewer = UIDocumentInteractionController(url: URL(fileURLWithPath: path)) viewer.delegate = self viewer.presentPreview(animated: true) } } // MARK:- URLSessionDownloadDelegate func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didFinishDownloadingTo location: URL) { print(downloadTask) print("File download succesfully") let path = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory, FileManager.SearchPathDomainMask.userDomainMask, true) let documentDirectoryPath:String = path[0] let fileManager = FileManager() let destinationURLForFile = URL(fileURLWithPath: documentDirectoryPath.appendingFormat("/file.pdf")) if fileManager.fileExists(atPath: destinationURLForFile.path){ showFileWithPath(path: destinationURLForFile.path) print(destinationURLForFile.path) } else{ do { try fileManager.moveItem(at: location, to: destinationURLForFile) // show file showFileWithPath(path: destinationURLForFile.path) }catch{ print("An error occurred while moving file to destination url") } } } func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didWriteData bytesWritten: Int64, totalBytesWritten: Int64, totalBytesExpectedToWrite: Int64) { progress.setProgress(Float(totalBytesWritten)/Float(totalBytesExpectedToWrite), animated: true) } func urlSession(_ session: URLSession, task: URLSessionTask, didCompleteWithError error: Error?) { downloadTask = nil progress.setProgress(0.0, animated: true) if (error != nil) { print("didCompleteWithError \(error?.localizedDescription ?? "no value")") } else { print("The task finished successfully") } } func documentInteractionControllerViewControllerForPreview(_ controller: UIDocumentInteractionController) -> UIViewController { return self } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } } 

इस कोड का उपयोग आप अपने एप्लिकेशन में दस्तावेज़ निर्देशिका में फाइल स्टोर को स्वचालित रूप से डाउनलोड करना चाहते हैं

यह कोड 100% काम कर रहा है

स्विफ्ट 3

 class ViewController: UIViewController { var urlLink: URL! var defaultSession: URLSession! var downloadTask: URLSessionDownloadTask! } // MARK: Button Pressed @IBAction func btnDownloadPressed(_ sender: UIButton) { let urlLink1 = URL.init(string: "https://github.com/VivekVithlani/QRCodeReader/archive/master.zip") startDownloading(url: urlLink!) } @IBAction func btnResumePressed(_ sender: UIButton) { downloadTask.resume() } @IBAction func btnStopPressed(_ sender: UIButton) { downloadTask.cancel() } @IBAction func btnPausePressed(_ sender: UIButton) { downloadTask.suspend() } func startDownloading (url:URL) { let backgroundSessionConfiguration = URLSessionConfiguration.background(withIdentifier: "backgroundSession") defaultSession = Foundation.URLSession(configuration: backgroundSessionConfiguration, delegate: self, delegateQueue: OperationQueue.main) downloadProgress.setProgress(0.0, animated: false) downloadTask = defaultSession.downloadTask(with: urlLink) downloadTask.resume() } // MARK:- URLSessionDownloadDelegate func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didFinishDownloadingTo location: URL) { print("File download succesfully") } func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didWriteData bytesWritten: Int64, totalBytesWritten: Int64, totalBytesExpectedToWrite: Int64) { downloadProgress.setProgress(Float(totalBytesWritten)/Float(totalBytesExpectedToWrite), animated: true) } func urlSession(_ session: URLSession, task: URLSessionTask, didCompleteWithError error: Error?) { downloadTask = nil downloadProgress.setProgress(0.0, animated: true) if (error != nil) { print("didCompleteWithError \(error?.localizedDescription)") } else { print("The task finished successfully") } } 

पृष्ठभूमि में फ़ाइलों को डाउनलोड करने के लिए URLSessionDownloadTask का उपयोग करें ताकि वे समाप्त हो जाएं, भले ही ऐप समाप्त हो जाए।

अधिक जानकारी के लिए देखें:

https://www.ralfebert.de/snippets/ios/urlsession-background-downloads/

यह भी बताता है कि समानांतर में चल रहे कई कार्यों के लिए प्रगति की निगरानी कैसे कार्यान्वित करें: