Pergunta

Eu tenho um UITableView que exibe um monte de imagens nas células, e não estou sair feliz com o desempenho de rolagem. Meu UITableView é algo como o aplicativo de fotos no iPhone. Alguém sabe por que o iphone foto pergaminhos de aplicativos tão maldito rápido como se a sua de nada na tela.

E Alguém tem algumas dicas / truques para aumentar o meu desempenho / velocidade de rolagem?

Foi útil?

Solução

Você deve precache suas imagens e não fazê-lo preguiçosamente. Como você rolar sua tabela de UITableViewDataSource: cellForRowAtIndexPath: método é chamado, e se você está carregando suas imagens lá, então você vai vê-lo solicitando seus conteúdos celulares como seu deslocamento, criando latência na sua aplicação. Tente colocar fazer a sua cellForRowAtIndexPath: algo como isto:

NSDate *date = [NSDate date];
... your cell loading code ...
NSLog( @"Elapsed time to generate cell %.2d", [date timeIntervalSinceNow] );

Você vai ver quanto tempo você está gastando para obter cada célula.

Para contornar este problema, você pode ser tão complexo como você precisa - se você tem um muito de imagens, você vai ter que ser mais e mais inteligente. Você pode fazer o carregamento paginada, onde você manter o controle da última célula do pedido NSIndexPath, e determinar se o deslocamento está indo para cima ou para baixo e uso + NSImage: imageNamed: para buscar ao mesmo tempo algum valor página de imagens para a frente (ou seja, 5 imagens para a frente de sua posição atual), ou o que funciona para você (aproveitando o fato de que as pessoas têm de voltar o dedo para a parte inferior da tabela para furto de novo, e assim o consumo de elementos da tabela tem pausas - que você pode fazer a sua grande o suficiente tamanho da página para preencher um furto). Esta é, provavelmente, ainda não é grande, embora, porque você só vai estar sofrendo todo o seu impacto de uma só vez, em vez de uma carga nervosa para cada célula.

Você pode retornar o controle para a interface do usuário de forma rápida e permitir que o sistema para agendar sua página prefetched de imagens usando NSRunLoop: performSelector: alvo: argumento: ordem: modo: fora do RunLoop principal usando NSImage:. imageNamed :, e então quando a célula é solicitado se você estiver buscando muito à frente ele vai estar disponível para exibição

Você precisa ser dolorosamente consciente das preocupações de memória embora. Se você está achando que isso seja um problema, uso NSImage: initWithContentsOfFile: , que irá limpar caches imagem em situações de pouca memória. Dependendo da estratégia usada pelo algoritmo de invalidação de cache estas situações podem causar uma "gagueira", como você limpar caches e tem que recarregar suas prefetches invalidados.

Outras dicas

Grandes rolagem resultados de desempenho foram relatados por subclasse UITableViewCell e desenhar o conteúdo de cada célula diretamente. Veja a resposta aceita para este questão para mais detalhes e links para exemplos de código.

O problema aqui é memória, que está a colocar muitas imagens de alta resolução de uma vez, o aplicativo foto não usa um tableview ele usa uma exibição de rolagem e só carrega um máximo de 3 fotografias de cada vez, por isso, a memória não é uma preocupação, se u estão tentando fazer algo semelhante para o aplicativo foto usar uma exibição de rolagem

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