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];
    }
  }  
}
Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top