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.