如何在 Swift 中将图像放入 NSCache?

Nic*_*cho 2 uiimage nscache swift swift4

我使用 swift 4 编写了一些代码来从 URL 加载图像,但是每次将图像添加到服务器时,都需要花费大量时间将其加载到集合视图或表视图中。我想尝试将其存储在 NScache 中,但我不明白该怎么做。谁能帮助我,我是 swift 的新手:(

@objc func loadPosts() {
    
    let url = URL(string: "http://someURL/Url.php")!

    var request = URLRequest(url: url)
    request.httpMethod = "POST"
    
    let body = "phomepost=\(homepost)"
    
    request.httpBody = body.data(using: String.Encoding.utf8)
    
    URLSession.shared.dataTask(with: request) { data, response, error in
        DispatchQueue.main.async(execute:  {
            if error == nil {
                do{
                    let json = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as? NSDictionary
                    
                    self.comments.removeAll(keepingCapacity: false)
                    self.images.removeAll(keepingCapacity: false)
                    self.collectionView?.reloadData()
                    
                    guard let parseJSON = json else {
                        print("Error While Parsing")
                        return
                    }
                    
                    guard let posts = parseJSON["posts"] as? [AnyObject] else {
                        print("Error while parseJSONing")
                        
                        return
                    }
                    self.comments = posts.reversed()
                    
                    for i in 0 ..< self.comments.count {
                        let path = self.comments[i]["path"] as? String
                        
                        if !path!.isEmpty {
                            let url = NSURL(string: path!)!
                            let imageData = try? Data(contentsOf: url as URL)
                            let image = UIImage(data: imageData! as Data)!
                            self.images.append(image)
                    
                        } else {
                            let image = UIImage()
                            self.images.append(image)
                        }
                    }
                    self.collectionView?.reloadData()
                    //print(posts.count)
                } catch {
                    print(error)
                }
            }else{
                print(error)
            }
        })
    }.resume()
}
Run Code Online (Sandbox Code Playgroud)

May*_*sam 6

你可以使用这样的东西:

private let cache = NSCache<NSString, NSData>()
.....
func downloadImage(url: String, handler: @escaping(Data?, Error?) -> Void){
            let cacheID = NSString(string: url)

            if let cachedData = cache.object(forKey: cacheID) {
                handler((cachedData as Data), nil)
            }else{
                if let url = URL(string: url) {
                    let session = URLSession(configuration: urlSessionConfig)
                    var request = URLRequest(url: url)
                    request.cachePolicy = .returnCacheDataElseLoad
                    request.httpMethod = "get"
                    session.dataTask(with: request) { (data, response, error) in
                        if let _data = data {
                            self.cache.setObject(_data as NSData, forKey: cacheID)
                            handler(_data, nil)
                        }else{
                            handler(nil, error)
                        }
                        }.resume()
                } else {
                    // NetworkError is a custom error
                    handler(nil, NetworkError.invalidURL)
                }
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)