我有两个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
}
}
问题:如果我在类别中选择几个项目非常快,我的单元格使用随机图像。如果我慢慢选择类别,我的单元格使用图像确定。
我的屏幕第一:如果我选择快速类别
第二:如果我慢慢选择类别,在屏幕上一切都很好。
如果我不使用后台异步线程,一切正常,但一切都开始减慢
请,任何帮助。
答案 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
}
}
这两个线程完全异步。您不能指望在主线程启动之前完成后台线程。
有一些方法可以将线程事件与信号和信号量进行通信,但在您的情况下,我认为使用带有完成处理程序的异步函数将是一种方式更合适。