2010-11-19 54 views
1

Je veux afficher un UIProgressView indiquant la quantité de données reçues lorsque je demande des données JSON en utilisant touchJSON. Je me demandais s'il y avait un moyen d'écouter la taille des données reçues.iOS: TouchJSON et taille des données récupérées

Je demande de données en utilisant les éléments suivants:

- (NSDictionary *)requestData 
{ 
    NSData   *data  = [NSData dataWithContentsOfURL:[NSURL URLWithString:apiURL]]; 
    NSError   *error  = nil; 
    NSDictionary *result  = [[CJSONDeserializer deserializer] deserializeAsDictionary:data error:&error]; 

    if(error != NULL) 
     NSLog(@"Error: %@", error); 

    return result; 
} 

Répondre

1

Vous devrez introduire un peu plus de code pour inclure une barre d'indicateur d'état de téléchargement. Au moment où vous téléchargez les données avec [NSData dataWithConentsOfURL:...]. Au lieu de cela, vous allez créer une classe qui utilise un objet NSURLConnection pour télécharger des données, accumuler ces données dans un objet MSMutableData et mettre à jour votre interface utilisateur en conséquence. Vous devriez pouvoir utiliser l'en-tête HTTP ContentLength et les mises à jour - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data; pour déterminer l'état du téléchargement.

Voici quelques méthodes pertinentes:

- (void) startDownload 
{ 
    downloadedData = [[NSMutableData alloc] init]; 
    connection = [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:YES]; 
} 

- (void)connection:(NSURLConnection *)c didReceiveResponse:(NSURLResponse *)response 
{ 
    totalBytes = [response expectedContentLength]; 
} 

// assume you have an NSMutableData instance variable named downloadedData 
- (void)connection:(NSURLConnection *)c didReceiveData:(NSData *)data 
{ 
    [downloadedData appendData: data]; 
    float proportionSoFar = (float)[downloadedData length]/(float)totalBytes; 
    // update UI with proportionSoFar 
} 

- (void)connection:(NSURLConnection *)c didFailWithError:(NSError *)error 
{ 
    [connection release]; 
    connection = nil; 
    // handle failure 
} 

- (void)connectionDidFinishLoading:(NSURLConnection *)c 
{ 
    [connection release]; 
    connection = nil; 
    // handle data upon success 
} 

Personnellement, je pense que la façon de le faire le plus simple est de créer une classe qui implémente les méthodes ci-dessus pour faire des téléchargements de données génériques et interface avec cette classe.

Cela devrait suffire à vous offrir ce dont vous avez besoin.