UICollectionView no se actualiza inmediatamente al llamar a reloadData, sino random después de 30-60 segundos

Como el título implica, mi UICollectionView no actualiza y muestra las celdas inmediatamente después de llamar a reloadData . En su lugar, parece que finalmente actualiza mi vista de colección después de 30-60 segundos. Mi configuration es la siguiente:

UICollectionView agregado a la vista del controller en Storyboard con la configuration de delegate y dataSource para el controller de vista y la configuration de salida estándar numberOfSectionsInRow y cellForItemAtIndexPath se implementan y hacen reference a la celda de prototipo y la imageView dentro de ella

Aquí está el código que va a Twitter, get una línea de time, lo asigna a una variable, vuelve a cargar una vista de tabla con los tweets y luego recorre los tweets para search fotos y recarga la vista de colección con esos elementos.

Incluso si comento el código para mostrar la image, todavía no cambia nada.

 SLRequest *timelineRequest = [SLRequest requestForServiceType:SLServiceTypeTwitter requestMethod:SLRequestMethodGET URL:timelineURL parameters:timelineParams]; [timelineRequest performRequestWithHandler:^(NSData *responseData, NSHTTPURLResponse *urlResponse, NSError *error) { if(responseData) { JSONDecoder *decoder = [[JSONDecoder alloc] init]; NSArray *timeline = [decoder objectWithData:responseData]; [self setTwitterTableData:timeline]; for(NSDictionary *tweet in [self twitterTableData]) { if(![tweet valueForKeyPath:@"entities.media"]) { continue; } for(NSDictionary *photo in [[tweet objectForKey:@"entities"] objectForKey:@"media"]) { [[self photoStreamArray] addObject:[NSDictionary dictionaryWithObjectsAndKeys: [photo objectForKey:@"media_url"], @"url", [NSValue valueWithCGSize:CGSizeMake([[photo valueForKeyPath:@"sizes.large.w"] floatValue], [[photo valueForKeyPath:@"sizes.large.h"] floatValue])], @"size" , nil]]; } } [[self photoStreamCollectionView] reloadData]; } }]; 

Este es un síntoma clásico de llamar a los methods UIKit desde un hilo de background. Si ve la documentation de -[SLRequest performRequestWithHandler:] , indica que el controller no garantiza el hilo en el que se ejecutará.

Envuelva su llamada para reloadData en un bloque y pase esto a dispatch_async() ; también pase dispatch_get_main_queue() como el argumento de la queue.

Debe enviar la actualización al hilo principal:

  dispatch_async(dispatch_get_main_queue(), ^{ [self.photoStreamCollectionView reloadData]; }); 

o en Swift:

 dispatch_async(dispatch_get_main_queue(), { self.photoStreamCollectionView.reloadData() }) 

Apple dice: No debe llamar a este método en medio de bloques de animation donde se insertan o eliminan elementos. Las inserciones y eliminaciones hacen que los datos de la tabla se actualicen de manera apropiada.

En la cara: no debe llamar a este método en el medio de ninguna animation (incluya UICollectionView en el desplazamiento).

así que puedes:

 [self.collectionView setContentOffset:CGPointZero animated:NO]; [self.collectionView performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:NO]; 

o marque seguro que no hay ninguna animation, y luego llame a reloadData; o

 [self.collectionView performBatchUpdates:^{ //insert, delete, reload, or move operations } completion:nil];