扩展程序,可以通过Web URL和本地目录通过文件名加载图像

时间:2019-06-24 07:28:54

标签: ios swift

我正在使用此扩展程序

extension UIImage {

    public static func loadFrom(url: URL, completion: @escaping (_ image: UIImage?) -> ()) {
        DispatchQueue.global().async {
            if let data = try? Data(contentsOf: url) {
                DispatchQueue.main.async {
                    completion(UIImage(data: data))
                }
            } else {
                DispatchQueue.main.async {
                    completion(nil)
                }
            }
        }
    }
}

我想要可以通过本地存储的图像文件名从Web URL加载的东西

本地位置是指由imagePickerController拾取并保存到coreData的图像,我需要将它们从collection view加载到CoreData中。 提出保存和加载本地图像的最佳方法,因为网络图像可以正常工作。

本地图片位置:

  

file:/// Users / abhishek / Library / Developer / CoreSimulator / Devices / E189ACEA-3A22-41C9-94DD-06ACE5A8D16D / data / Containers / Data / Application / 96851D78-3BD6-4CAA-83AF-0E752FEF10B1 / tmp / 542CB563-6233-4C96-9ACA-25984F3CBF98.jpeg

Web URL示例为here

4 个答案:

答案 0 :(得分:1)

您可以尝试一下。 https://github.com/SDWebImage/SDWebImage。该库可以满足您的需求,并且可以缓存图像。

答案 1 :(得分:1)

extension UIImage {

    public static func loadFrom(url: URL, completion: @escaping (_ image: UIImage?) -> ()) {
        DispatchQueue.global().async {
            if let data = try? Data(contentsOf: url) {
                DispatchQueue.main.async {
                    completion(UIImage(data: data))
                }
            } else {
                DispatchQueue.main.async {
                    completion(nil)
                }
            }
        }
    }
}

答案 2 :(得分:0)

接受URL参数,而不是接受loadFrom方法中的String参数。

String可以是urlStringimageAssets的名称。

extension UIImage {
    public static func loadFrom(urlString: String, completion: @escaping (_ image: UIImage?) -> ()) {
        if let image = UIImage(named: urlString) {
            DispatchQueue.main.async {
                completion(image)
            }
        } else {
            if let url = URL(string: urlString) {
                DispatchQueue.global().async {
                    if let data = try? Data(contentsOf: url) {
                        DispatchQueue.main.async {
                            completion(UIImage(data: data))
                        }
                    } else {
                        DispatchQueue.main.async {
                            completion(nil)
                        }
                    }
                }
            }
        }
    }
}

在上面的代码中,首先检查名称为image的{​​{1}}是否存在于项目本身中。如果不是,则从urlString创建一个URL,然后从该urlString获取image

用法:

URL

答案 3 :(得分:0)

解决了,我没有传递本地URL,而是过滤了它的名称,现在我传递了名称,在扩展方面做了一些更改

extension UIImage {

    public static func loadFrom(url: String, completion: @escaping (_ image: UIImage?) -> ()) {
        DispatchQueue.global().async {
            if let data = try? Data(contentsOf: URL(string: url)!) {
                DispatchQueue.main.async {
                    completion(UIImage(data: data))
                }
            }
            else {
                DispatchQueue.main.async {
                    let documentDirectory = FileManager.SearchPathDirectory.documentDirectory
                    let userDomainMask = FileManager.SearchPathDomainMask.userDomainMask
                    let paths = NSSearchPathForDirectoriesInDomains(documentDirectory, userDomainMask, true)
                    if let dirPath = paths.first {
                        let imageURL = URL(fileURLWithPath: dirPath).appendingPathComponent("\(url)")
                        let image = UIImage(contentsOfFile: imageURL.path)
                        completion(image)
                    }
                }
            }
        }
    }
}

现在它就像一个魅力

我从here

寻求帮助