Я пытаюсь получить актив из локального идентификатора и отображать изображения в коллекционном представлении, но это делает рывок прокрутки
Я пытаюсь следующий метод для извлечения актива из локального идентификатора и отображения его в виде коллекции, но прокрутка становится рывком при загрузке.
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "GridCell", for: indexPath) as! GridCell
cell.representedAssetIdentifier = "some uri"
let requestOptions = PHImageRequestOptions()
requestOptions.isSynchronous = false
let asset = PHAsset.fetchAssets(withLocalIdentifiers: ["some uri"!], options: .none).firstObject
imageManager.requestImage(for: asset!, targetSize: thumbnailSize, contentMode: .aspectFit, options: requestOptions, resultHandler: { result, info in
if cell.representedAssetIdentifier =="someuri" {
cell.imageview.image = result
}
})
2 ответа
PHAsset.fetchAssets( .. )
вызов происходит синхронно, что блокирует рендеринг collectionView и вызывает заикание прокрутки. Для плавной прокрутки всегда выбирайте ресурсы асинхронно, чтобы не блокировать основной поток.
Для загрузки PHAssets, предлагаем посмотреть на PHImageManager
класс предоставлен Cocoa Touch.
Дорогостоящие операции не должны выполняться в cellForItemAt
метод. Неустойчивость заключается в том, что прокрутка задерживается до завершения этого метода. Это конкретно вызывается строкой:
let asset = PHAsset.fetchAssets(withLocalIdentifiers: ["some uri"!], options: .none).firstObject
удалите эту строку, и вы увидите, что прокрутка будет гладкой, как масло. Чтобы это исправить, вам нужно быть более умным в отношении того, где и когда будет выполнена эта строка, если ее можно использовать повторно, затем сделайте это один раз. viewDidLoad
и сохранить его как переменную.