细胞使用随机图像

时间:2018-05-28 14:30:35

标签: ios swift multithreading

我有两个UICollectionView

1 UICollectionView - 发布

2 UICollectionView - 类别

逻辑:

当用户点按任何categories时,我们会发送新的api请求,然后更新post collection view

在我的UICollectionViewCell中有两个条件。

1 Image Item

2 Video Item

在我的代码下面:

class PopularPostsCell: UICollectionViewCell {
@IBOutlet weak var myImage : UIImageView!

func setupItems(childPostsItem: ChildPostsModel, index: Int) {
    if childPostsItem.media_type != "video" {
        myImage.image = nil
        myImage.sd_setImage(with: URL(string: childPostsItem.media), placeholderImage: UIImage(named: ""))
    } else {
        DispatchQueue.global(qos: .background).async {
            let locImage = Helpers.videoSnapshot(filePathLocal: childPostsItem.media)
            DispatchQueue.main.async {
                self.myImage.image = nil
                self.myImage.image = locImage
            }
        }
    }
}

override func prepareForReuse() {
    super.prepareForReuse()
    myImage.image = nil
}

}

如果video,我需要从我的代码下面的视频网址获取图片:

static func videoSnapshot(filePathLocal: String) -> UIImage? {
    do {
        let asset = AVURLAsset(url: URL(string: filePathLocal)!, options: nil)
        let imgGenerator = AVAssetImageGenerator(asset: asset)
        imgGenerator.appliesPreferredTrackTransform = true
        let cgImage = try imgGenerator.copyCGImage(at: CMTimeMake(0, 1), actualTime: nil)
        let thumbnail = UIImage(cgImage: cgImage)
        return thumbnail
    } catch let error {
        print("*** Error generating thumbnail: \(error.localizedDescription)")
        return nil
    }        
}

问题:如果我在类别中选择几个项目非常快,我的单元格使用随机图像。如果我慢慢选择类别,我的单元格使用图像确定。

我的屏幕第一:如果我选择快速类别

enter image description here

第二:如果我慢慢选择类别,在屏幕上一切都很好。

如果我不使用后台异步线程,一切正常,但一切都开始减慢

请,任何帮助。

enter image description here

1 个答案:

答案 0 :(得分:0)

您正在以顺序方式使用后台线程和主线程,而根据定义它们是并行的并且不会彼此等待。因此:

DispatchQueue.global(qos: .background).async {
     let locImage = Helpers.videoSnapshot(filePathLocal: childPostsItem.media)
     DispatchQueue.main.async {
         self.myImage.image = nil
         self.myImage.image = locImage
     }
}

这两个线程完全异步。您不能指望在主线程启动之前完成后台线程。

有一些方法可以将线程事件与信号信号量进行通信,但在您的情况下,我认为使用带有完成处理程序的异步函数将是一种方式更合适。

查看其工作原理:https://stackoverflow.com/a/50531255/5922920