Je charge des données à partir d'une API et j'utilise un UIProgressView pour afficher la quantité chargée.
À mon avisWillAppear j'utilise Reachability pour vérifier qu'il y a une connection internet. Ensuite, s'il y en a, la ligne suivante est appelée 10 fois dans une fonction.
[self performSelectorInBackground:@selector(updateProgress) withObject:nil];
Cela exécute ensuite cette méthode
-(void)updateProgress { float currentProgress = myProgressBar.progress; NSLog(@"%0.2f", currentProgress); [loadingProg setProgress:currentProgress+0.1 animated:YES]; }
Le flottant augmente de 0,1 et la vue de chargement l'affiche.
Lorsque la vue est ignorée (il s'agit d'une vue modale), puis callbackée, la méthode s'exécute et NSLog montre que currentProgress s'incrémente comme il se doit. Cependant, la barre de progression rest vide. Est-ce que quelqu'un sait ce qui pourrait causer cela?
Pour reference, j'utilise ARC.
Mettre à jour:
C'est comme ça que j'appelle l'API
NSSsortingng *urlSsortingng = **url**; NSURL *JSONURL = [NSURL URLWithSsortingng:urlSsortingng]; NSURLRequest *request = [NSURLRequest requestWithURL:JSONURL cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:10]; if(connectionInProgress) { [connectionInProgress cancel]; } connectionInProgress = [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:YES]; //This is where I call the update to the progress view
Et j'ai ces fonctions:
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response { JSONData = [NSMutableData data]; [JSONData setLength:0]; } - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { [JSONData appendData:data]; } -(void) connectionDidFinishLoading:(NSURLConnection *)connection { //add data to mutable array and other things }
Lorsque vous traitez des composants de l'interface user (UI), vous devez exécuter les methods dans le thread principal. En règle générale, lorsque vous programmez, vous devez définir des opérations d'interface user dans le thread principal et des opérations lourdes, complexes et plus exigeantes en termes de performances dans les threads d'arrière-plan – ce que l'on appelle le multithreading Central Dispatch: si vous devez faire des opérations plus longues, consultez ce bon tutoriel de Ray Wenderlich .)
Pour résoudre ce problème, vous devez appeler [self performSelectorOnMainThread:@selector(updateProgress) withObject:nil];
puis, dans la méthode, ce qui suit:
-(void)updateProgress { float currentProgress = myProgressBar.progress; NSLog(@"%0.2f", currentProgress); dispatch_async(dispatch_get_main_queue(), ^{ [loadingProg setProgress:currentProgress+0.1 animated:YES]; }); }
Les actualisations de l'interface user doivent se produire sur le thread principal. Changement
[self performSelectorInBackground:@selector(updateProgress) withObject:nil];
à
[self performSelectorOnMainThread:@selector(updateProgress) withObject:nil waitUntilDone:NO];