8
votes

"pour" boucle de boucle lors du téléchargement de NsmutableArray

J'ai 4 éléments dans mon nsmutableArray code>. J'ai ce code net pour télécharger des fichiers et afficher les données du fichier dans uitextview code> à des fins de test. Sans le pour code> boucle, tout va bien. Le code qui me donne le problème est dans cette fonction:

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

- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
    NSString *dataString = [[NSString alloc] initWithData:downloadData encoding:NSASCIIStringEncoding];
    self.dataTextView.text = dataString;
    [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO];
    NSLog(@"Download finished!");
    isBusy = NO;
}

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {
    NSLog(@"%@", error);
    [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO];
}


6 commentaires

Vous devriez vraiment utiliser la classe Nsoperation au lieu de faire comme ça


@Pierre Je sais, j'ai essayé, le problème est que NsoperationQueue a des limitations, je ne peux pas réorganiser les opérations et je ne peux pas les gérer suffisamment bien.


Ou des blocs. En tout cas, avez-vous le journal ou la sortie du crash complet? Cela pointe généralement vers le problème sous-jacent. Vous pouvez également ajouter un point d'arrêt des exceptions. Allez sous l'onglet Point d'arrêt et ajoutez un nouveau point d'arrêt d'exception. Cela s'arrêtera sur la ligne qui vous pleure afin que vous puissiez comprendre pourquoi.


@Billburgess j'ai édité le message avec la capture d'écran de la sortie d'accident.


Avez-vous défini un point d'arrêt d'exception? Je suppose oui. Parfois, c'est une bonne idée de cliquer sur «Continuer» une ou deux fois. Il peut nécessiter des clics «Continuer» avant le message d'erreur réel est affiché sur la console de débogage. Cependant - regarde la pile d'appels. L'exception est lancée quelque part dans Sgdownloader complexdownL ... Cliquez dessus et vous devriez voir dans quelle ligne de votre Coude la précédente est jointe. Veuillez nous revenir avec cette information supplémentaire.


N'a pas lu le fil entier à travers, mais cela devrait provoquer une exception de plage puisque votre boucle itérale à partir de 0 à Array.count et accéder au tableau [arrat.count] est au-delà des limites. Devrait être array.count-1


4 Réponses :


6
votes

Je suppose que c'est que, à un moment donné, downloadarray [i] est corrompu à un moment donné, ou ce n'est pas un nsurl. Le code se bloque dans cfurlcopyabsoluteURL () appelé depuis [NSURLREQUEST DemandeWithURL ...] .


1 commentaires

Tu avais raison! L'URL transmise à l'ivar était de type Nstring et je ne l'ai pas remarquée parce que c'était pris directement de Nsarray.



1
votes

Vous prenez l'ASYNC API initwithrequest: Délégué: et essayez de le rendre synchrone en utilisant isbusy drapeau. Cette approche est très erronée pour commencer, la classe NsurlConnection est suffisamment intelligente, n'a pas besoin d'utiliser des drapeaux arbitraires si vous l'utilisez correctement. Vous devriez sérieusement reconsidérer à l'aide de Nsoperations ou de GCD. Si vous envisagez de faire une programmation de connectivité plus compliquée, vous devriez peut-être envisager d'utiliser un cadre de tiers comme Restkit.


2 commentaires

Les nsopérations ont beaucoup de limitations et cette approche, bien que ce soit vraiment complexe, donne en effet des options sur ce qui est téléchargé et quand.


Je ne pense pas que ce soit complexe, c'est juste une mauvaise utilisation de l'API NsurlConnection, qui va être source de confusion pour quiconque gère ou met à jour ce code. La réponse de Hermann s'adresse à la mauvaise utilisation de l'API, alors je suis content que vous l'aimiez.



1
votes

Débarrassez-vous de la boucle pour la boucle et l'indicateur isbusy. Dans ComplexTownload Traisez toujours le premier ou le dernier (quel que soit le dernier (quel est le plus approprié), ce n'est que le retirer de la matrice. Dans ConnectionDidfinish Invoke ComplexTownload à nouveau. Utilisez performalector pour cela. Le temps d'attente peut même être 0.0f. Ce faisant, votre downloadarray agirait comme une sorte de file d'attente.


1 commentaires

Merci beaucoup pour le conseil inestimable! C'est une bonne idée!



1
votes

Je pense que c'est un problème avec l'objet URL dans [NSURLREQUEST DemandeWithURL: URL Il n'est pas nécessaire de copier l'URL dans un objet supplémentaire. Essayez ceci:

NSURL *url = [NSURL URLWithString:[downloadArray objectAtIndex:i]];


2 commentaires

ASIHTTPEQUEST est génial mais il n'a pas été pris en charge depuis longtemps. On m'a dit que Github.com/afnetworking/afnetworking est un bon à utiliser ces jours-ci.


Oui c'est vrai, le dernier commit pour AsihttPequest est il y a 5 mois! Merci pour cette alternative, je vais tester cela dans le projet en cours.