AssetsLibrary e ImageView -setImage Lentidão
-
15-09-2020 - |
Pergunta
Portanto, este é um anúncio muito estranho. Não tenho certeza se o problema está na API AssetsLibrary, mas não consigo descobrir o que mais pode estar acontecendo.
Estou carregando um array com ALAssets usando o método -enumerateAssetsUsingBlock em ALAssetsGroup.Quando terminar, estou carregando um scroller de imagem personalizado.À medida que a rolagem termina a rolagem, eu uso NSInvocationOperations para carregar as imagens das visualizações (páginas) atualmente visíveis da biblioteca de fotos no disco.Depois que a imagem é carregada e armazenada em cache, ela notifica o delegado, que então captura a imagem do cache e a exibe em uma visualização de imagem no scroller.
Tudo funciona bem, mas o tempo que leva desde quando -setImage:na verdade, é chamado no momento em que aparece visivelmente na tela é insuportável - às vezes 10 segundos ou mais para realmente aparecer.
Eu tentei com e sem redimensionamento de imagem, o que não acrescenta quase nada ao tempo de processamento quando faço o redimensionamento.Como eu disse, a lentidão ocorre em algum lugar depois de chamar -setImage na visualização da imagem.Alguém está ciente de algum tipo de aspecto da API AssetLibrary que pode causar isso?
Aqui está um código relevante:
- (void)setImagesForVisiblePages;
{
for (MomentImageView *page in visiblePages)
{
int index = [page index];
ALAsset *asset = [photos objectAtIndex:index];
UIImage *image = [assetImagesDictionary objectForKey:[self idForAsset:asset]];
// If the image has already been cached, load it into the
// image view. Otherwise, request the image be loaded from disk.
if (image)
{
[[page imageView] setImage:image];
}
else {
[self requestLoadImageForAsset:asset];
[[page imageView] setImage:nil];
}
}
}
Solução
Isso provavelmente irá atrapalhar qualquer pesquisa na web que procure resolver problemas com a AssetsLibrary, então peço desculpas por isso.Acontece que o problema não era o AssetsLibrary, mas sim o meu uso de multi-threading.Assim que a imagem terminou de carregar, eu estava postando uma notificação usando o NSNotificationCenter padrão.Ele estava postando no thread de segundo plano que estava atualizando (ou tentando atualizar, pelo menos) o UIImageView com -setImage.Depois que mudei para usar -performSelectorOnMainThread e fiz com que o seletor definisse a imagem, tudo ficou bem.
Parece que não importa o quão familiarizado eu esteja com o multi-threading, ainda esqueço as pequenas pegadinhas de vez em quando.