Como tornar o ui responsivo o tempo todo e atualizar o plano de fundo?

Estou criando um aplicativo que exibe 8 miniaturas por página e pode ter n páginas. Cada uma dessas miniaturas são UIViews e são adicionadas ao UIScrollView. No entanto, eu implementei Paging usando o código de amostra da Apple.

O prob:

  1. Cada miniatura (UIView) leva 150 milissegundos para ser criada e adicionada à visualização de rolagem
  2. Daí para 3 páginas demora muito tempo para ser criado e adicionado ao Scrollview da interface do usuário.
  3. Neste ponto, a visualização de rolagem não é muito respsonsive e é muito irregular e dá uma má experiência ao usuário
  4. Como posso criar as miniaturas e adicioná-las ao UIScrollview sem afetar a capacidade de resposta do toque? Eu quero que eles sejam executados independentemente do thread principal, que é responsável por manipular events de toque (suponho).

Também gostaria de mencionar que quando uma miniatura é criada i triggersr um download Async da imagem eo método delegado é chamado quando o download for concluído.

Deixe-me saber as opções que tenho para tornar isso mais responsivo e atualizar a interface do usuário sem afetar as operações de toque. O controle de página funciona bem com o carregamento lento da grade de miniaturas.

TIA,

Praveen S

O Grand Central Dispatch é fácil de usar para carregamento em segundo plano. Mas o GCD é apenas para depois do iOS4. Se você tiver que suportar o iOS3, executeSelectorInBackground / performSelectorOnMainThread ou NSOperationQueue.

E, tenha cuidado, as classs quase UIKit não são seguras para threads, exceto o desenho para um contexto gráfico. Por exemplo, o UIScrollView não é thread-safe, UIImage imageNamed: não é thread-safe, mas UIImage imageWithContentsOfFile: é thread-safe.

dispatch_queue_t mainQueue = dispatch_get_main_queue(); dispatch_queue_t concurrentQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); dispatch_async(concurrentQueue, ^{ dispatch_apply([thumbnails count], concurrentQueue, ^(size_t index) { Thumbnail *thumbnail = [thumbnails objectAtIndex:index]; thumbnail.image = [UIImage imageWithContentsOfFile:thumbnail.url]; dispatch_sync(mainQueue, ^{ /* update UIScrollView using thumbnail. It is safe because this block is on main thread. */ }); } /* dispatch_apply waits until all blocks are done */ dispatch_async(mainQueue, ^{ /* do for all done. */ }); } 

Eu estava tendo um problema semelhante.
O que eu fiz foi em uma instância eu mantive apenas 3 páginas na memory e limpei todos restantes.
Se supor que existem 3 canvass s1, s2, s3. E o usuário está vendo s2. Sempre que ele rola para s3 eu vou remover s1 e carregar uma nova página s4.
Para que os usuários tenham uma experiência melhor. E menos memory será ocupada.

Se você estiver usando uma subvisualização ou um ViewController separado para cada “página” ou elemento do ScrollView, o mau humor ou o mau desempenho podem ser ajudados, alterando a localização do seu código.

Especificamente, o código de exemplo da apple para um scrollview com pagecontrol tem algo parecido com isto:

 [self loadScrollViewWithPage:page - 1]; [self loadScrollViewWithPage:page]; [self loadScrollViewWithPage:page + 1]; 

No entanto, esse código aparece em sua amostra no método “scrollViewDidScroll”. Ele está tentando realizar várias tarefas pesadas ao rolar e carregar ao mesmo tempo. Mesmo que suas imagens sejam locais, isso é desagradável.

Se você mover este código e o código relacionado, incluindo uma referência à página atual para “scrollViewDidEndDecelerating”, a irregularidade da interface será resolvida, pois o carregamento ocorrerá enquanto a rolagem não estiver mais em movimento.