2009-05-25 6 views
2

J'essaie d'ajouter dynamiquement des sous-vues à un UiScorllView en temps réel (pour économiser de la mémoire). Cela fait que le scrollview se bloque pendant une brève seconde ... comment contourner cela?Ajout de sous-vues à UiScrollView .. smoothly

des conseils appréciés

Répondre

3

-vous sur la façon dont l'UITableView résout ce problème. Vos plus grands succès en termes de performances sont l'allocation et le dessin initial de la sous-vue, mais principalement l'allocation. UITableView s utilise un identifiant de réutilisation et un tas en mémoire pour conserver toutes ses cellules en mémoire pendant le défilement afin de réutiliser les cellules déjà allouées au lieu d'en réaffecter de nouvelles chaque fois qu'une nouvelle cellule défile dans la zone visible. Peut-être pourriez-vous implémenter votre propre système de réutilisation de sous-vue pour vous épargner tout ce temps d'allocation. Encore une fois, lire spécifiquement sur la façon dont le UITableView le fait et modélisez le vôtre à partir de cela. Malheureusement, il n'y a vraiment pas de solution plus facile que celle à laquelle je peux penser.

2

Je suggère que toute action susceptible de bloquer l'interface utilisateur soit placée dans un thread. De cette façon, le processus d'ajout de la sous-vue se fera en arrière-plan, sans perturber le fil principal.

Vous pouvez soit faire cela par NSThread ou vous pouvez implémenter le NSOperationQueue.

La déclaration de NSThread est simple;

[NSThread detachNewThreadSelector:@selector(myFunction:) toTarget:myObject withObject:argumentObject]; 

Où myFunction »devrait être remplacé par le nom d'une fonction, le « myObject » avec un objet (ou simplement état self si vous voulez que la classe actuelle pour gérer le fil) et « argumentObject » devraient être remplacé par tout objet que vous voulez transmettre en tant qu'argument; cela peut être nil

La fonction elle-même devrait ressembler à ceci;

-(void)myFunction { 
    NSAutoReleasePool *pool = [[NSAutoReleasePool alloc] init]; 
    // do your thing here... 
    [pool release]; 
} 

Chaque thread doit avoir un pool d'autorelease.

Un indice; Si votre sous-vue doit animer, essayez de déclarer un UIAnimation bloc