NSCache для хранения изображений для UITableView в Swift

Я новичок в быстром программировании, и я много искал о хранении изображений с помощью NSCache с использованием Swift.

Что я сделал до сих пор, так это то, что я получаю ids и imageNames с JSON, и у меня есть данные в массиве, и я смог без проблем отображать изображение в ячейках. Теперь я хочу кэшировать изображения. Это код, который я написал:

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as TableViewCell

        //cell.imageView
         nameID = self.hoge[indexPath.row]["cars"]["carid"].string!
        cell.nameLabel.text = nameID

        if let imageFileURL = imageCache.objectForKey(self.hoge[indexPath.row]["cars"]["carid"].intValue) as? NSURL {
            println("Get image from cache")

        } else {

            imageName = self.hoge[indexPath.row]["cars"]["pic_name"].string!

            // If the image does not exist, we need to download it
            var imgURL: NSURL = NSURL(string: "http://192.168.1.35/car/uploads/" + imageName )!

            var image:UIImage = UIImage(named: "pen")!
            // Download an NSData representation of the image at the URL
            let request: NSURLRequest = NSURLRequest(URL: imgURL)
            NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue.mainQueue(), completionHandler: {(response: NSURLResponse!,data: NSData!,error: NSError!) -> Void in
                if error == nil {
                    image = UIImage(data: data)!
                    cell.viewCell.image = image

                }
                else {
                    println("Error: \(error.localizedDescription)")
                }
            })

        }

        return cell
    }

Итак, как я могу хранить и извлекать изображения с кешем?


person user970956    schedule 12.03.2015    source источник


Ответы (1)


Я рекомендую вам проверить эту библиотеку HanekeSwift (она предоставляет память и дисковый кеш LRU для UIImage, NSData, JSON, String или любого другого тип, который можно читать или записывать как данные), по крайней мере, чтобы понять, как они работают с кешем, и вы можете решить использовать его или создать свое собственное решение.

Используя очень простой/простой API:

// Setting a remote image
imageView.hnk_setImageFromURL(url)

// Setting an image manually. Requires you to provide a key.
imageView.hnk_setImage(image, key: key)

Использование кеша

let cache = Shared.dataCache

cache.set(value: data, key: "image.png")

// Eventually...

cache.fetch(key: "image.png").onSuccess { data in
     // Do something with data
}
person gabriel    schedule 12.03.2015
comment
спасибо за решение. Но я заметил, что для установки я должен включить весь проект. Разве это не снизит производительность моего приложения? - person user970956; 12.03.2015
comment
Что делать, если я не использую эту структуру? Каково решение? - person user970956; 12.03.2015
comment
Вам просто нужно включить соответствующую библиотеку в свой проект, это не снизит производительность. Если вы не хотите использовать этот фреймворк, вы можете попробовать то, что я предложил, изучить некоторые методы, которые они используют, и реализовать то, что вам больше подходит. - person gabriel; 12.03.2015
comment
Спасибо, я только что нашел один способ установки, в котором говорилось: «Перетащите Haneke.xcodeproj» в ваш проект в _Project Navigator. Каков другой способ, чтобы мне не нужно было включать весь проект в свое приложение? - person user970956; 12.03.2015
comment
Создайте папку с именем library (или с любым другим именем) и перетащите туда только файлы, относящиеся к библиотеке (не тесты, xibs и т. д.). Вы можете увидеть в этой папке все, что необходимо: github.com/Haneke/HanekeSwift/ дерево/мастер/Ханеке - person gabriel; 12.03.2015
comment
Не могли бы вы привести пример, который сначала проверяет, кэшируются ли данные, если да, то возвращаете эти данные, иначе получите их из сети? Это довольно запутанно для меня. Большое спасибо. - person user970956; 13.03.2015