Как сохранить несколько изображений в каталог документов и получить путь в Swift

Я работаю над приложением Swift.

Я получаю ответ сервера, как показано ниже

 [[“image_url": https://someurl1, "title": Title1], ["image_url": https://someurl2, "title": Title2], ["image_url": https://someurl3, "title": Title3], ["image_url": https://someurl4, "title": Title4]]

Я должен сохранить эти данные в базе данных (Coredata). но прежде чем эти данные попадут в базу данных, мне нужно загрузить изображения, и я должен добавить их в каталог документов, и я должен получить этот путь. И этот путь к документу, который я должен сохранить в базе данных, если пользователь не в сети, мне нужно получить этот путь и показать изображения в Tableview.

для скачивания использую ниже

     func apiCall() {
// after api calls, getting response
    for eachData in json {
        print("eachData \(eachData)")
        let imageURL = eachData["image_url"]
        if let url = imageURL {
            let fileUrl = URL(string: url as! String)
            print("fileUrl \(fileUrl!)")
            Home().downloadImage(from: fileUrl! )

           //here I have to store each data into database after getting each image document path

        }
}

func getData(from url: URL, completion: @escaping (Data?, URLResponse?, Error?) -> ()) {
    URLSession.shared.dataTask(with: url, completionHandler: completion).resume()
}

func downloadImage(from url: URL) {
    print("Download Started")
    getData(from: url) { data, response, error in
        guard let data = data, error == nil else { return }
        print(response?.suggestedFilename ?? url.lastPathComponent)
        print("Download Finished")

    }
}

Какие-либо предложения?


person Anilkumar iOS - ReactNative    schedule 21.05.2020    source источник


Ответы (1)


Во-первых, вам нужно это расширение, потому что вы будете использовать его много раз.

extension FileManager {

    static func getDocumentsDirectory() -> URL {
    let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
    let documentsDirectory = paths[0]
    return documentsDirectory
 }
}

Если у вас есть URL-адрес изображения, вы можете получить изображение, подобное этому

    func fetchImageFrom(url: String) {
    // This will make sure you're not saving a filename with slashes as
    // they will be treated like directories
    let urlArray = url.components(separatedBy: "/")
    let fileName = urlArray.last!

    DispatchQueue.global(qos: .userInitiated).async {
        if let imageURL = URL(string: url) {
            if let imageData = try? Data(contentsOf: imageURL) {
                if let image = UIImage(data: imageData) {
                    // Now lets store it
                    self.storeImageWith(fileName: fileName, image: image)
                }
            }
        }
    }
}

func storeImageWith(fileName: String, image: UIImage) {
    if let data = image.jpegData(compressionQuality: 0.5) {
        // Using our extension here
        let documentsURL = FileManager.getDocumentsDirectory()
        let fileURL = documentsURL.appendingPathComponent(fileName)

         do {
            try data.write(to: fileURL, options: .atomic)
            print("Storing image")
          }
          catch {
           print("Unable to Write Data to Disk (\(error.localizedDescription))")
          }
      }
}
person Waylan Sands    schedule 21.05.2020