UIRefreshControl endRefreshing no es uniforme

Cuando mis datos han terminado de cargarse y mi tablaView se ha vuelto a cargar, llamo a endRefreshing en mi control de actualización, luego salta de su estado de carga y desaparece: ¿cómo puedo implementar una animation suave que deslice el control de actualización cuando se completa ?

Estoy agregando una nueva respuesta ya que la única no es muy precisa en explicación. Y esto probablemente sea demasiado para comentarios.

La solución de Halpo es correcta. Pero la razón mencionada es incorrecta.

Llamadas -[NSObject (NSDelayedPerforming) performSelector:withObject:afterDelay:] garantiza que la llamada se realizará en la siguiente iteración de runloop.

Entonces esto no funciona, porque hay un pequeño retraso, pero lo estás moviendo al siguiente ciclo.

En realidad, sh / podría disminuir el retraso a 0.0 y todavía funcionaría. Además, es posible una implementación más correcta (en términos de utilizar el object destinado a lograr algo, no mejor en el resultado).

Aquí están los diversos fragments de código para eso:

 // SOLUTION I [[self tableView] reloadData]; [[self refreshControl] performSelector:@selector(endRefreshing) withObject:nil afterDelay:0.0]; // SOLUTION II (semantically correct) [[self tableView] reloadData]; [[NSOperationQueue currentQueue] addOperationWithBlock:^{ [[self refreshControl] endRefreshing]; }]; // SOLUTION III (GCD) dispatch_async(dispatch_get_main_queue(), ^{ [[self refreshControl] endRefreshing]; }]; 

EDITAR

Como señaló johann-fradj , también podrías usar GCD. Me gusta mucho el GCD, pero creo que la solución II es más descriptiva sobre lo que está pasando. Además, GCD no es muy Objective-C-ish, así que personalmente prefiero seguir mi solución.

Se solucionó el problema: agregué un pequeño retraso a endRefresh después de volver a cargar los datos:

 [self.tableView reloadData]; [self.refreshControl performSelector:@selector(endRefreshing) withObject:nil afterDelay:0.05]; 

Intente envolver la llamada a endRefreshing() en un bloque de animation UIView:

También me he topado con este problema. Para endRefreshing() la documentation indica:

 UIView.animateWithDuration(0.5) { self.refreshControl.endRefreshing() } 

La documentation dice:

Si las animaciones también están habilitadas, el control se oculta usando una animation.

Una de las razones puede ser que actualice su vista de tabla después de llamar a endRefresh. Por ejemplo, mis llamadas solían verse así:

 [self.refreshControl beginRefreshing]; [self.network getThings:^(id things, NSError *error) { [self.refreshControl endRefreshing]; if (error) { ... } else { self.things = things; [self.tableView reloadData]; } }]; 

Lo que es malo, porque la tabla se actualiza mientras se ejecuta la animation endRefresh. Entonces, el código hecho correctamente se ve así:

 [self.refreshControl beginRefreshing]; [self.network getThings:^(id things, NSError *error) { if (error) { [self.refreshControl endRefreshing]; ... } else { self.things = things; [self.tableView reloadData]; [self.refreshControl endRefreshing]; } }];