Загрузите CKAssets в асинхронный UICollectionView
Есть ли способ загрузить фотографию CKAsset в UICollectionView асинхронно? В настоящий момент внутри queryCompletionHandler из CKDatabase executeQuery я получаю список CKRecords с CKAssets, а затем устанавливаю для изображений UICollectionView значение CKAsset.fileURL.path, что я затем делаю [UICollectionView reload]
Перезагрузка занимает много времени, потому что кажется, что она загружает все изображения одновременно. Я хочу использовать AsyncImageView ( https://github.com/nicklockwood/AsyncImageView) для отображения заполнителя во время загрузки реальных изображений.
Невозможно увидеть способ использования AsyncImageView (или любой другой библиотеки) для загрузки фотографий CKAsset,
Есть идеи?
3 ответа
В вашем случае ваши файлы CKAsset напрямую связаны с CKRecords, которые вы выбираете для результата своей таблицы. Благодаря этому вы будете иметь доступ к активам в момент возврата результата. Доступность файлов напрямую связана с возвращенными записями. Есть 2 способа сделать это лучше.
Используйте perRecordCompletionBlock для операции CKFetchRecordsOperation. Затем, когда вы выполните ваш запрос, все записи будут приходить по одной. Каждый раз, когда появляется запись, вы можете добавить ее в свой tableView. В этом случае вы не увидите данные, пока они не будут получены. строки будут добавляться одна за другой, пока у вас не будет всех.
Поместите каждый CKAsset в свой собственный CKRecord и добавьте ссылку в исходной записи к этой записи актива. Затем запросите исходные записи, чтобы получить данные без активов, а затем для каждой ячейки запустите новую выборку (будет асинхронной, поэтому не нужно делать никаких действий, просто установите изображение cels), чтобы получить соответствующую запись актива, а затем просто актив. Преимущество этого подхода заключается в том, что вы увидите все данные в виде таблицы, но не увидите связанное изображение, пока оно не будет получено.
Одно замечание: когда вы устанавливаете изображение с помощью CKAsset.fileURL.path, вы можете сделать это только внутри блока завершения CloudKit. Расположение URL - это местоположение в кэше CloudKit. Вы не сможете узнать, как долго это изображение будет находиться в этом месте. Если вы хотите, чтобы файл оставался доступным, вам необходимо скопировать его в папку с документами.
С использованием operation.desiredKeys
свойство также вариант. Если вы знаете ключи записи заранее, вы можете использовать ее для включения или исключения ключей, включая CKAsset
s, из операции извлечения записи.
Другая причина, по которой это было медленно, [collectionView reloadData] делается в фоновом потоке. Как только это было сделано в главном потоке с помощью dispatch_get_main_queue(), изображения отображаются намного быстрее, чем раньше.