Alamofire 下载到文件系统不起作用
Alamofire download to file system doesn't work
在我们将 Alamofire 下载到我们的应用程序之前,我正在创建一个测试项目。现在,我遇到了一个奇怪的问题,也许我不明白 Alamofire 下载或 FileManager
是如何工作的。
我只是从 URL 下载了 3 个文件,并希望将它们存储在文件系统中。之后,我想将它们用作 WKWebView 中的本地数据(尚未实现)。
这是我的ViewController:
import UIKit
class ViewController: UIViewController {
@IBAction func loadWebsite(_ sender: Any) {
NetworkService.shared.getFile(path: "webview.html", completion: {
NetworkService.shared.getFile(path: "css/style.css", completion: {
NetworkService.shared.getFile(path: "images/square.jpg", completion: {
self.fillInContent()
})
})
})
}
private func fillInContent() {
let documentURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0]
let fileUrl = documentURL.appendingPathComponent("webview.html")
if FileManager.default.fileExists(atPath: fileUrl.absoluteString) {
print("True")
} else {
print("no webview")
}
}
}
我知道用于加载资源的代码在完成块中启动新请求时写得不是很好,但同样它只是一个测试项目。
这是我的 NetworkService 单例:
import UIKit
import Alamofire
class NetworkService {
static let shared = NetworkService()
// Thread-safe
private init() {}
func getFile(path: String, completion: @escaping() -> Void) {
let destination: DownloadRequest.DownloadFileDestination = {_, _ in
let documentURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0]
let fileURL = documentURL.appendingPathComponent(path)
return (fileURL, [.removePreviousFile, .createIntermediateDirectories])
}
Alamofire.download("https://myurl.com/" + path, to: destination)
.responseData { response in
if let error = response.result.error {
print("Error: \(error.localizedDescription)")
}
completion()
}
}
}
当我打印出 NetworkService 中的文件 URLs 或 VC 中的 fillInContent()
时,它们是正确的。但是,fillInContent()
方法总是打印出 "no webview"。所以该文件不存在。我预计它会被其他完成块覆盖,但即使我在完成块中启动函数,fileExist()
也 returns 为假。即使我删除了对 getFile()
的其他 2 个调用,我也不会在此处获得 fileExists 的真实信息。
当前行为:我总是"no webview"。
预期行为: fillInContent()
方法打印出 "True".
非常感谢任何帮助或指导!
编辑: 在 运行 项目两次后,我也收到此错误消息:'Error: The file “Documents” couldn’t be saved in the folder “1E07C511-B5B3-4B5A-84E1-8EF61F6B7340” because a file with the same name already exists.'
尝试使用此方法获取文档目录:
try? FileManager.default.url(for: .documentDirectory,
in: .userDomainMask,
appropriateFor: nil,
create: true)
并使用 fileUrl.path
而不是 fileUrl.absoluteString
在我们将 Alamofire 下载到我们的应用程序之前,我正在创建一个测试项目。现在,我遇到了一个奇怪的问题,也许我不明白 Alamofire 下载或 FileManager
是如何工作的。
我只是从 URL 下载了 3 个文件,并希望将它们存储在文件系统中。之后,我想将它们用作 WKWebView 中的本地数据(尚未实现)。
这是我的ViewController:
import UIKit
class ViewController: UIViewController {
@IBAction func loadWebsite(_ sender: Any) {
NetworkService.shared.getFile(path: "webview.html", completion: {
NetworkService.shared.getFile(path: "css/style.css", completion: {
NetworkService.shared.getFile(path: "images/square.jpg", completion: {
self.fillInContent()
})
})
})
}
private func fillInContent() {
let documentURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0]
let fileUrl = documentURL.appendingPathComponent("webview.html")
if FileManager.default.fileExists(atPath: fileUrl.absoluteString) {
print("True")
} else {
print("no webview")
}
}
}
我知道用于加载资源的代码在完成块中启动新请求时写得不是很好,但同样它只是一个测试项目。
这是我的 NetworkService 单例:
import UIKit
import Alamofire
class NetworkService {
static let shared = NetworkService()
// Thread-safe
private init() {}
func getFile(path: String, completion: @escaping() -> Void) {
let destination: DownloadRequest.DownloadFileDestination = {_, _ in
let documentURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0]
let fileURL = documentURL.appendingPathComponent(path)
return (fileURL, [.removePreviousFile, .createIntermediateDirectories])
}
Alamofire.download("https://myurl.com/" + path, to: destination)
.responseData { response in
if let error = response.result.error {
print("Error: \(error.localizedDescription)")
}
completion()
}
}
}
当我打印出 NetworkService 中的文件 URLs 或 VC 中的 fillInContent()
时,它们是正确的。但是,fillInContent()
方法总是打印出 "no webview"。所以该文件不存在。我预计它会被其他完成块覆盖,但即使我在完成块中启动函数,fileExist()
也 returns 为假。即使我删除了对 getFile()
的其他 2 个调用,我也不会在此处获得 fileExists 的真实信息。
当前行为:我总是"no webview"。
预期行为: fillInContent()
方法打印出 "True".
非常感谢任何帮助或指导!
编辑: 在 运行 项目两次后,我也收到此错误消息:'Error: The file “Documents” couldn’t be saved in the folder “1E07C511-B5B3-4B5A-84E1-8EF61F6B7340” because a file with the same name already exists.'
尝试使用此方法获取文档目录:
try? FileManager.default.url(for: .documentDirectory,
in: .userDomainMask,
appropriateFor: nil,
create: true)
并使用 fileUrl.path
而不是 fileUrl.absoluteString