Загрузить CKAssets в UICollectionView асинхронно

Есть ли способ загрузить фотографию CKAsset в UICollectionView асинхронно? На данный момент внутри queryCompletionHandler из CKDatabase PerformQuery я получаю список CKRecords с CKAssets, а затем устанавливаю изображения UICollectionView в CKAsset.fileURL.path, что затем делаю [UICollectionView reload]

Перезагрузка занимает много времени, потому что кажется, что загружаются все изображения одновременно. Я хочу использовать AsyncImageView (https://github.com/nicklockwood/AsyncImageView) для отображать заполнитель во время загрузки реальных изображений.

Не вижу способа использовать AsyncImageView (или любую другую библиотеку) для загрузки фотографий CKAsset,

Есть идеи ?


person Lydon Ch    schedule 26.05.2015    source источник


Ответы (3)


В вашем случае ваши файлы CKAsset напрямую связаны с CKRecords, которые вы извлекаете для результата своей таблицы. Из-за этого у вас будут активы, доступные в момент возврата результата. Доступность файлов напрямую связана с возвращенными записями. Есть 2 способа сделать это лучше.

  1. Используйте блок perRecordCompletionBlock для CKFetchRecordsOperation. Затем, когда вы выполните свой запрос, все записи будут поступать одна за другой. Каждый раз, когда появляется запись, вы можете добавить ее в свой tableView. В этом случае вы не увидите данные, пока они не будут получены. строки будут добавляться одна за другой, пока вы не получите все.

  2. Поместите каждый CKAsset в его собственный CKRecord и добавьте ссылку в исходную запись на эту запись актива. Затем запросите исходные записи, чтобы получить данные без активов, а затем для каждой ячейки запустите новую выборку (будет асинхронной, поэтому не нужно делать никакой магии, просто установите изображение cels), чтобы получить связанную запись актива, а затем просто актив. Преимущество этого подхода заключается в том, что вы увидите все данные в табличном представлении, но вы не увидите связанное изображение, пока оно не будет получено.

Одно замечание: когда вы устанавливаете изображение с помощью CKAsset.fileURL.path, вы можете сделать это только внутри блока завершения CloudKit. Расположение URL-адреса — это расположение кэша CloudKit. Вы не сможете узнать, как долго это изображение будет оставаться в этом месте. Если вы хотите убедиться, что файл остается доступным, вам необходимо скопировать его в папку с документами.

person Edwin Vermeer    schedule 27.05.2015
comment
Спасибо @Edwin, теперь я использую № 2, помещая каждый CKAsset в свой собственный CKRecord. - person Lydon Ch; 28.05.2015

Использование свойства operation.desiredKeys также является вариантом. Если вы заранее знаете ключи записи, вы можете использовать их для включения или исключения ключей, включая CKAssets, из операции выборки записи.

person mattsven    schedule 27.12.2015

Еще одна причина, по которой это было медленно, [reloadData collectionView] выполняется в фоновом потоке. Как только это было сделано в основном потоке с помощью dispatch_get_main_queue(), изображения отображаются намного быстрее, чем раньше.

person Lydon Ch    schedule 31.05.2015