2010-11-23 8 views
5

J'ai créé un UIProgressView. Mais j'ai utilisé NSTimer au processus UIProgressView's. Maintenant, je dois intégrer le processus UIProgressView, lorsque l'URL est en cours de chargement. UIProgressView's taille dépendra des données NSURLConnection's.Ajouter le processus de chargement NSURLConnection sur UIProgressView

J'ai utilisé le code suivant pour NSURLConnection.

-(void)load { 
    NSURL *myURL = [NSURL URLWithString:@"http://feeds.epicurious.com/newrecipes"]; 
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:myURL 
                  cachePolicy:NSURLRequestReloadIgnoringLocalCacheData 
                 timeoutInterval:60]; 

    [[NSURLConnection alloc] initWithRequest:request delegate:self]; 
} 

-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response { 
    responseData = [[NSMutableData alloc] init]; 
} 


-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { 
    [responseData appendData:data]; 
} 

-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error { 
    [connection release]; 

    UIAlertView *alert = [[UIAlertView alloc] init]; 
    [alert setTitle:@"Warning"]; 
    [alert setMessage:@"Network Connection Failed?"]; 
    [alert setDelegate:self]; 
    [alert addButtonWithTitle:@"Yes"]; 

    [alert show]; 
    [alert release]; 

    NSLog(@"Error"); 
} 

-(void)connectionDidFinishLoading:(NSURLConnection *)connection 
{ 
    responsetext = [[[NSString alloc] initWithData:responseData encoding: NSASCIIStringEncoding] autorelease]; 
} 

Répondre

15

Dans votre fonction didReceiveResponse vous pourriez obtenir le taille totale du fichier comme ceci: _totalFileSize = response.expectedContentLength;.

Dans votre fonction didReceiveData vous pouvez ajouter jusqu'à un nombre total d'octets reçu compteur: _receivedDataBytes += [data length];

Maintenant, afin de mettre la barre de progression à la taille correcte, vous pouvez simplement faire: MyProgressBar.progress = _receivedDataBytes/(float)_totalFileSize

(soit dans la fonction didReceiveData ou ailleurs dans votre code)

N'oubliez pas d'ajouter les variables qui contiennent le nombre d'octets à votre classe!

J'espère que cela aide ..

EDIT: Voici comment vous pouvez mettre en œuvre les délégués afin de mettre à jour progressview

-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response { 
    _totalFileSize = response.expectedContentLength; 
    responseData = [[NSMutableData alloc] init]; 
} 


-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { 
    _receivedDataBytes += [data length]; 
    MyProgressBar.progress = _receivedDataBytes/(float)_totalFileSize; 
    [responseData appendData:data]; 
} 
+0

Comment déclarer réponse à didReceiveResponse, s'il vous plaît modifier le code suivant. - (void) connexion: (NSURLConnection *) connexion didReceiveData: (NSData *) données { \t totalFileSize = response.expectedContentLength; \t receivedDataBytes + = [longueur de données]; \t NSLog (@ "totalFileSize/totalFileSize =% f", receivedDataBytes/totalFileSize); \t [responseData appendData: données]; } – Velmurugan

+0

didReceiveResponse et didReceiveData sont 2 délégués différents. Il doit être: - (void) connexion: (NSURLConnection *) connexion didReceiveResponse: (NSURLResponse *) réponse { totalFileSize = response.expectedContentLength; } et de supprimer cette ligne de didReceiveData – Hless

+0

Édité ma réponse. J'ai oublié de mentionner que l'une des valeurs avec lesquelles vous divisez doit être castée dans un flotteur. Puisque vous pourriez autrement finir avec un nombre entier, sans précision de flotteur. – Hless