Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift:从Internet下载图像并缓存它们';我不能正常工作。需要建议吗_Swift_Caching_Uicollectionview_Alamofire - Fatal编程技术网

Swift:从Internet下载图像并缓存它们';我不能正常工作。需要建议吗

Swift:从Internet下载图像并缓存它们';我不能正常工作。需要建议吗,swift,caching,uicollectionview,alamofire,Swift,Caching,Uicollectionview,Alamofire,我是swift的新手,我正在构建一个从互联网下载图像并在UICollectionView中显示的应用程序,我可以成功地实现此功能,但是,你滚动屏幕时,它似乎超时了,它一次又一次地下载图像,这可能会导致用户的大量数据。我发现我可以使用缓存来解决这个问题,但它不起作用,我认为我做的一切都是对的,但数据似乎没有存储在缓存中。这是代码,有人能帮我解决吗?谢谢 var imageCache = [String: UIImage]() class ViewController: UIViewControll

我是swift的新手,我正在构建一个从互联网下载图像并在UICollectionView中显示的应用程序,我可以成功地实现此功能,但是,你滚动屏幕时,它似乎超时了,它一次又一次地下载图像,这可能会导致用户的大量数据。我发现我可以使用缓存来解决这个问题,但它不起作用,我认为我做的一切都是对的,但数据似乎没有存储在缓存中。这是代码,有人能帮我解决吗?谢谢

var imageCache = [String: UIImage]()
class ViewController: UIViewController {
override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}
}

extension ViewController: UICollectionViewDataSource {

func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int {
    return 1
}

func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    return 5
}

func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCellWithReuseIdentifier("cell", forIndexPath: indexPath) as! CollectionViewCell

    Alamofire.request(.GET, "http://localhost:8888/wordpress/wp-json/wp/v2/posts").responseJSON { (response) in
        if let jsonFile = response.result.value {

            var arrayOfPosts = [Posts]()

            for post in jsonFile as! NSArray {

                let postObj = Posts()
                postObj.postThumbnailUrlString = post.valueForKeyPath("featured_image_thumbnail_url") as! String

                arrayOfPosts.append(postObj)
            }


            let imageUrlString: String = arrayOfPosts[indexPath.row].postThumbnailUrlString

            let imageUrl: NSURL = NSURL(string: imageUrlString)!







            if let imageFromCache = imageCache[imageUrlString] {

                cell.imageView.image = imageFromCache
                return
            }

            let request = NSURLRequest(URL: imageUrl)
            let session = NSURLSession.sharedSession()
            let dataTask = session.dataTaskWithRequest(request) { (data, response, error) in

                let imageToCache = UIImage(data: data!)

                imageCache[imageUrlString] = imageToCache

                dispatch_async(dispatch_get_main_queue(), {



                    cell.imageView.image = imageToCache
                })

            }

            dataTask.resume()



        }

    }


   return cell

}}
我还有一类帖子和一个定制的collectionviewcell。这让我耽搁了很长时间,真希望有人能帮我解决这个问题。谢谢

使用

Swift 2.2或2.3

在pod文件中添加-->pod“AlamofireImage”和“~>2.5”

Swift 3.1

在pod文件中添加-->pod“AlamofireImage”和“~>3.3”

在代码中放入以下行,它将自动缓存图像并将其下载

override func viewDidLoad() {
     super.viewDidLoad()
     //hit your web service here to get all url's
 }

func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int
{
   return arrImageURL.count
}


func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell
{ 
   cell.imgViewPhoto.af_setImageWithURL(arrImageURL[indexPath.row], placeholderImage: UIImage())
}
使用

Swift 2.2或2.3

在pod文件中添加-->pod“AlamofireImage”和“~>2.5”

Swift 3.1

在pod文件中添加-->pod“AlamofireImage”和“~>3.3”

在代码中放入以下行,它将自动缓存图像并将其下载

override func viewDidLoad() {
     super.viewDidLoad()
     //hit your web service here to get all url's
 }

func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int
{
   return arrImageURL.count
}


func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell
{ 
   cell.imgViewPhoto.af_setImageWithURL(arrImageURL[indexPath.row], placeholderImage: UIImage())
}

翠鸟是一个轻量级的、纯Swift实现的库,用于从web下载和缓存图像。该项目深受流行的SDWebImage的启发。它为您提供了在下一个应用程序中使用纯Swift替代方案的机会。

翠鸟是一个轻量级、纯Swift实现的库,用于从web下载和缓存图像。该项目深受流行的SDWebImage的启发。它为您提供了在下一个应用程序中使用纯Swift替代方案的机会。

使用<代码> SDWebImage <代码>库下载图像,它也将缓存图像。如果你已经使用了ALAMOFE,最好考虑一下。与SDWebImage非常相似,它们有一个执行异步图像检索的
UIImageView
扩展,它解决了上面包含的代码中的许多问题。(例如,它不仅会缓存,还会处理单元格是否被重新用于不同的索引路径等)您可以使用
cell.imageView.af_setImageWithURL
方法替换上述所有图像检索和缓存代码。正如您所说,我以前尝试过,因为我已经使用了Alamofire,但是我不知道为什么它和上面的代码做同样的工作。我需要创建一个缓存来存储数据还是自动创建它?谢谢,我对swift很陌生~~实际上我尝试了AlamofireImage、Haneke和其他类似的库,它们都可以成功下载图像,但它们都是一样的,每次我滚动collectionview时,图像都会很快变为正确的图像,我想这是因为它没有缓存图像。我不知道为什么会发生这种情况。使用<代码> SDWebImage <代码>库下载图像,它也会缓存图像。如果你已经使用了ALAMOFE,最好考虑一下。与SDWebImage非常相似,它们有一个执行异步图像检索的
UIImageView
扩展,它解决了上面包含的代码中的许多问题。(例如,它不仅会缓存,还会处理单元格是否被重新用于不同的索引路径等)您可以使用
cell.imageView.af_setImageWithURL
方法替换上述所有图像检索和缓存代码。正如您所说,我以前尝试过,因为我已经使用了Alamofire,但是我不知道为什么它和上面的代码做同样的工作。我需要创建一个缓存来存储数据还是自动创建它?谢谢,我对swift很陌生~~实际上我尝试了AlamofireImage、Haneke和其他类似的库,它们都可以成功下载图像,但它们都是一样的,每次我滚动collectionview时,图像都会很快变为正确的图像,我想这是因为它没有缓存图像。我不知道为什么会发生这种情况?我以前尝试过,但我没有放置占位符图像,我必须指定占位符图像还是“.at_setImageWithURL(NSURL(string:“abc.com”))已经存储了缓存?因为它在我的情况下不起作用。Thankscell.imgViewPhoto.af_setImageWithURL(NSURL(string:“abc.com”))它已经在维护缓存,不需要放置文件夹图像..!但它对我不起作用。每次我滚动屏幕时,图像都会快速变为正确的图像,这意味着它会再次下载。我不知道为什么?不要点击cellForItemAtIndexPath中的web服务,请参阅编辑的答案。我看到了。让我试试。非常感谢。我尝试了这个首先,但我没有放置占位符图像,我必须指定占位符图像还是“.at_setImageWithURL(NSURL(string:“abc.com”))已经存储了缓存?因为它在我的情况下不起作用。Thankscell.imgViewPhoto.af_setImageWithURL(NSURL(string:“abc.com”))其已维护缓存,不需要PlaceHolder图像。。!但这对我不起作用。每次我滚动屏幕时,图像都会快速切换到右侧,这意味着它会再次下载。我不知道为什么?不要点击cellForItemAtIndexPath中的web服务,请参阅编辑的答案我明白了。让我试试这个。非常感谢。你知道翠鸟是否可以在不加载的情况下将图像附加到单元格中吗?因为如果我在第30个手机上,我滚动回到第1个,然后它会再次从内存中加载它们,但如果手机是旧的,它会很烦人。你知道翠鸟是否可以在不加载的情况下将图像附加到手机上吗?因为如果我在第30个手机上,我滚动回到第1个,然后它会再次从内存中加载它们,但如果手机是旧的,那就很烦人了