Заредете CKAsets в UICollectionView async

Има ли начин да заредите 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

Друга причина, поради която беше бавен, [collectionView reloadData] се извършва във фонова нишка. Веднага след като беше направено в основната нишка с помощта на dispatch_get_main_queue(), изображенията се показват много по-бързо, отколкото са били преди.

person Lydon Ch    schedule 31.05.2015