uicollectionviewdelegateflowlayout automatic ios objective-c uicollectionview

ios - automatic - UICollectionView no se actualiza inmediatamente al llamar a reloadData, pero al azar después de 30-60 segundos



uicollectionview dynamic cell size (3)

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

UICollectionView agregado para ver el controlador en Storyboard con configuración tanto de delegate como de dataSource para el controlador de vista y el número de configuración de salida estándarOfSectionsInRow y cellForItemAtIndexPath se implementan y hacen referencia a la celda prototipo y la imageView en imageView interior

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

Incluso si comento el código para mostrar la imagen, 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]; } }];


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

En la cara: no debe llamar a este método en medio de ninguna animación (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 que no haya ninguna animación, y luego llame a reloadData; o

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


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() })


Este es un síntoma clásico de llamar a métodos UIKit desde un hilo de fondo. Si ve la documentación -[SLRequest performRequestWithHandler:] , indica que el controlador no garantiza que subproceso 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 cola.