こんにちは。きんくまです。小ネタです。
Alamofireの使い方のチュートリアルをやっていました。
>> Alamofire/Documentation/Usage.md
だいたい一通りやってみたのですが、1箇所だけうまくいきませんでした。
download の部分です。レスポンスの中身がnilになってしまいました。
サンプルコード
let url = "https://httpbin.org/image/png" Alamofire.download(url) .responseData { [weak self](res) in guard let myself = self else { return } print("status \(res.response?.statusCode)") //200で返ってくる print("value \(res.result.value)") //ここがnilになる if let data = res.result.value { //なので、この中は通らない let image = UIImage(data: data) myself.pictureImageView.image = image }
それで、最初どこが間違っているのかわからなかったのですけど、ドキュメントをよく見てみたら注釈にこう書いてありました。
This will only work on macOS as is. Other platforms don’t allow access to the filesystem outside of your app’s sandbox. To download files on other platforms, see the Download File Destination section.
上の場合がうまくいくのはmacOSの場合だけです。その他のプラットフォームはアプリ内サンドボックス以外ではアクセスの許可ができません。その他のプラットフォームの場合は、ダウンロード先の部分をみてね!
ということなので、ちゃんとダウンロード先を明示します。
修正したコード
let url = "https://httpbin.org/image/png" let dest:DownloadRequest.DownloadFileDestination = { _, _ in let documentsURL = FileManager.default.urls(for: .cachesDirectory, in: .userDomainMask)[0] let fileURL = documentsURL.appendingPathComponent("pig.png") return (fileURL, [.removePreviousFile, .createIntermediateDirectories]) } Alamofire.download(url, to: dest) .responseData { [weak self](res) in guard let myself = self else { return } print("status \(res.response?.statusCode)") //200 print("value \(res.result.value)") //nilじゃない if let data = res.result.value { let image = UIImage(data: data) myself.pictureImageView.image = image //表示される } }
無事にブタさんが表示されました。よかったです。ではでは。
■ 自作iPhoneアプリ 好評発売中!
・フォルメモ - シンプルなフォルダつきメモ帳
・ジッピー電卓 - 消費税や割引もサクサク計算!
■ LINEスタンプ作りました!
毎日使える。とぼけたウサギ