2013-08-06 4 views
0

J'ai une question. Je JSON obtenir de mon URL, il ressemble à ceci:Objectif-C JSON à TableView très lent

- (NSMutableArray *)parseObject:(NSString *)object withKey:(NSInteger)key { 
NSUserDefaults *standardUserDefaults = [NSUserDefaults standardUserDefaults]; 
NSString *randomKey = [standardUserDefaults stringForKey:@"randomKey"]; 

NSString *urlString = [NSString stringWithFormat:@"http://domain.com"]; 
NSURL *url = [NSURL URLWithString:urlString]; 
NSData *data = [NSData dataWithContentsOfURL:url]; 
NSError *error; 
NSMutableDictionary *json = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error]; 

NSArray* latestLoans = [json objectForKey:@"object"]; 
NSDictionary* loan = [latestLoans objectAtIndex:key]; 

NSArray *myWords = [[loan objectForKey:object] componentsSeparatedByString:@","]; 

return myWords; 
} 

Pour ma TableView

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

static NSString *CellIdentifier = @"Cell"; 

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
if (cell == nil) { 
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier]; 
} 

cell.textLabel.text = [[self parseObject:@"bedrijfsnaam" withKey:0] objectAtIndex:indexPath.row]; 
//cell.detailTextLabel.text = [[self parseObject:@"leverunix" withKey:0] objectAtIndex:indexPath.row]; 
cell.textLabel.font = [UIFont systemFontOfSize:14.0]; 
cell.textLabel.lineBreakMode = UILineBreakModeWordWrap; 
cell.textLabel.numberOfLines = 3; 
cell.selectionStyle = UITableViewCellSelectionStyleNone; 
return cell; 
} 

Il charge très lentement et j'ai une sorte de lag quand je veux faire défiler. Que puis-je faire pour améliorer cela?

Merci

Répondre

3

Il semble que vous rapportez les données JSON du serveur chaque fois quecellForRowAtIndexPath est appelé. Cela doit être lent!

Vous devriez chercher les données qu'une seule fois (par exemple dans viewDidLoad), désérialiser le JSON et stocker le résultat dans une propriété du contrôleur de vue, de sorte que cellForRowAtIndexPath peut obtenir les objets à partir de là.

+0

J'ai un tableau dans viewDidLoad et met toutes mes données dans ce tableau, cela fonctionne parfaitement maintenant. Merci –

+0

Plus généralement, vous effectuez une opération de blocage sur le thread principal, ce qui signifie que la cellule n'est pas créée tant que la réponse JSON n'a pas été reçue et analysée. Si le serveur prend 30 secondes pour répondre, votre application ne répondra pas pendant 30 secondes !!! –

+0

@HenkdeBoer: Vous êtes les bienvenus. - Mais jetez aussi un oeil à la réponse de timthetoolman. Même une seule demande d'URL peut prendre beaucoup de temps, donc extraire les données de manière asynchrone (ou dans un thread d'arrière-plan) pour éviter que l'interface principale ne soit bloquée est également un bon conseil. –

0

Vous appelez

- (NSMutableArray *)parseObject:(NSString *)object withKey:(NSInteger)key 

encore et encore dans cellForRowAtIndexPath.

Cela ne devrait pas arriver. Essayez d'avoir vos données dans viewDidLoad ou viewWillAppear, puis sauvegardez ces données dans une variable globale.

Appelez maintenant n'importe quelle fonction qui obtiendra les données de cette variable et retournera la valeur requise.

+0

Variable globale? –

+0

toute variable locale à la classe –

2

Votre appel à

NSData *data = [NSData dataWithContentsOfURL:url]; 

provoque le thread principal pour bloquer pendant qu'il récupère les données à partir de l'URL Web.

Essayez d'utiliser une méthode asynchrone. Cela va résoudre le problème.

+0

Merci c'est très utile. –