在实现将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或VC中打印文件URL时,它们是正确的。但是,fillInContent()方法总是打印出“无网络视图”。因此该文件不存在。我希望它会被其他完成块覆盖,但是即使我在完成块中立即启动该函数,fillInContent()也会返回false。即使我删除了另外两个对fileExist()的调用,我在这里对于fileExists也不会正确。

当前行为:我一直都“没有网络视图”。

预期的行为:getFile()方法将打印出“ True”。

任何帮助或指导都非常感谢!

编辑:两次运行该项目后,我还收到此错误消息:'错误:无法将文件“文档”保存在文件夹“ 1E07C511-B5B3-4B5A-84E1-8EF61F6B7340”中,因为已经有一个同名文件存在。”

最佳答案

尝试使用此方法获取文档目录:

try? FileManager.default.url(for: .documentDirectory,
                             in: .userDomainMask,
                             appropriateFor: nil,
                             create: true)


并使用fileUrl.path代替fileUrl.absoluteString

10-08 05:45
查看更多