Swiftでファイルをダウンロードするにはどうすればいいですか? 質問する

Swiftでファイルをダウンロードするにはどうすればいいですか? 質問する

私は Android から iOS 用の Apple Swift プログラミングを学び始めたところです。基本的には Swift コードを読んだり操作したりできるようになり、iOS Swift プログラミングで使用される一般的なクラスもいくつか学びましたが、構文などについてはまだ混乱しています。

ファイルをダウンロードしようとしています。このURLからダウンロードするとします

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

ボタンをクリックするだけで、視覚的な進行も可能

ここで stackoverflow で検索していたところ、偶然 Alamofire を見つけました。試してみるつもりですが、これが私にとって最善の方法かどうかはわかりません。

そこで、目標を達成するために、どのようなオプション(iOS7 と iOS8)を利用できるのか、またその方法を教えてください。また、長所と短所も教えていただけると嬉しいです。

ベストアンサー1

Alamofire を使用しないダウンローダー クラスの例:

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

Swift 3 バージョン

また、大きなファイルはメモリではなくディスクにダウンロードすることに注意してください。`downloadTask: を参照してください。

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()
    }
}

おすすめ記事