1

我有两个UICollectionView

1 UICollectionView- 发布

2 UICollectionView- 类别

逻辑:

当用户点击 anycategories时,我们发送新的 api 请求然后更新post collection view

在我的 UICollectionViewCell 中有两个条件。

1Image Item

2Video 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,我需要从我的代码下面的视频 URL 获取图像:

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
    }        
}

问题:如果我快速选择类别中的多个项目,我的单元格使用随机图像。如果我慢慢选择类别,那我的​​手机使用图像就可以了。

我的屏幕优先:如果我快速选择类别

在此处输入图像描述

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

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

请,任何帮助。

在此处输入图像描述

4

1 回答 1

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

于 2018-05-28T14:53:41.840 回答