UICollectionView加载较晚,滚动非常颠簸

时间:2016-01-08 12:59:06

标签: ios swift scroll uicollectionview

我正在设计一个集合视图,我在其中尝试加载存储在数组中的字典中的图像和文本。我在这里的主阵列,即bannerarray正在其他一些函数中被解析。但我遇到的问题是,当我滚动它以加载图像时,我的集合视图变得不稳定,好像它在滚动道路上有颠簸。我找了各种答案和代码,但没有一个解决了我的问题。

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


        dispatch_async(dispatch_get_main_queue(),
            {
                let categoryname = self.categoriesarray.objectAtIndex(indexPath.row).valueForKey("name")

                cell.layer.shouldRasterize = true;
                cell.layer.rasterizationScale = UIScreen.mainScreen().scale



                let imageurl = self.categoriesarray.objectAtIndex(indexPath.row).valueForKey("image") as! String

                if let url  = NSURL(string: imageurl),
                    data = NSData(contentsOfURL: url)
                {

                    cell.lndngimage.image = UIImage(data: data)
                }
                if indexPath.row % 2 == 0
                {
                    cell.backgroundColor = UIColor(red: 67/255.0, green: 179/255.0, blue: 246/255.0, alpha: 1.0)
                }
                else if indexPath.row % 3 == 0 && indexPath.row%2 != 0
                {
                    cell.backgroundColor = UIColor.redColor()
                }
                else
                {
                    cell.backgroundColor = UIColor.greenColor()
                }
                cell.lndngimg.text = categoryname as? String

        })



        return cell
    }

请帮忙!提前谢谢。

3 个答案:

答案 0 :(得分:0)

问题是您使用NSData(contentsOfURL :)方法同步加载图像并阻止UI。像AFNetworking提供的异步方法不会引起这种干扰。

答案 1 :(得分:0)

NSData(contentsOfURL:url) 

在主线程上下载图像,这将阻止主线程更新UI。您应该使用NSOperation子类来下载图像。 Ray Wenderlich在这个问题上有一个great tutorial。您可以使用其他替代方法,例如SDWebImage

希望有所帮助!

编辑:

正如Sunil上面指出的那样,您不需要在dispatch_async区块中完成大部分工作。您需要异步执行的唯一任务是图像下载。当您准备好更新UIImageView

时,请确保跳回主队列

答案 2 :(得分:0)

let queue = dispatch_queue_create("loader", nil)
dispatch_async(queue) { () -> Void in
//download the image do stuff
//like data = NSData(contentsOfURL: url)

//move back in main thread
dispatch_async(dispatch_get_main_queue(),{
    //set the image.
    //cell.lndngimage.image = UIImage(data: data)
     })
 }

所以data = NSData(contentsOfURL: url)在主线程中下载一个图像,这是为什么UICollectionView加载迟到或者可能阻塞只做一件事创建队列来下载图像并将其设置在主线程中。