случайное изображение использования клетки - PullRequest
0 голосов

У меня есть два 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Мне нужно получить изображение с 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
    }        
}

Проблема: Если я быстро выбираю несколько элементов в категории, моя ячейка использует случайное изображение.Если я выбираю категорию медленно, то моя ячейка использует изображение в порядке.

Мой экран первый: если я выбираю категорию быстро

enter image description here

секунда: если я выбираю категорию медленно, на экране все хорошо.

Если я не использую фоновую асинхронную нить, все хорошо, но все начинает замедляться

Пожалуйста, помогите.

enter image description here

1 Ответ

0 голосов
/ 28 мая 2018

Вы используете фоновый поток и основной поток последовательно, в то время как по определению они параллельны и не ждут друг друга.Поэтому в:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...