ios multithreading ios5 uiprogressview

ios - UIProgressView no se actualiza?



multithreading ios5 (3)

Sí, todo el propósito de la vista de progreso es para enhebrar.

Si está ejecutando ese ciclo en el hilo principal, está bloqueando la IU. Si bloquea la interfaz de usuario, los usuarios pueden interactuar y la interfaz de usuario no se puede actualizar. Deberías hacer todo el trabajo pesado en el hilo de fondo y actualizar la interfaz de usuario en el hilo principal.

Aquí hay una pequeña muestra

- (void)viewDidLoad { [super viewDidLoad]; [self performSelectorInBackground:@selector(backgroundProcess) withObject:nil]; } - (void)backgroundProcess { for (int i = 0; i < 500; i++) { // Do Work... // Update UI [self performSelectorOnMainThread:@selector(setLoaderProgress:) withObject:[NSNumber numberWithFloat:i/500.0] waitUntilDone:NO]; } } - (void)setLoaderProgress:(NSNumber *)number { [progressView setProgress:number.floatValue animated:YES]; }

Empecé a jugar con UIProgressView en iOS5, pero realmente no he tenido suerte. Tengo problemas para actualizar la vista. Tengo un conjunto de acciones secuenciales, después de cada actualización de progreso. El problema es que la vista de progreso no se actualiza poco a poco, sino solo después de que todos hayan terminado. Es algo parecido a esto:

float cnt = 0.2; for (Photo *photo in [Photo photos]) { [photos addObject:[photo createJSON]]; [progressBar setProgress:cnt animated:YES]; cnt += 0.2; }

Al examinar el desbordamiento de la pila, he encontrado publicaciones como esta: SetProgress ya no está actualizando UIProgressView desde iOS 5 , lo que implica que para que esto funcione, necesito ejecutar un hilo por separado.

Me gustaría aclarar esto, ¿realmente necesito hilo separado para que UIProgressView funcione correctamente?


Definir UIProgressView en archivo .h :

IBOutlet UIProgressView *progress1;

En archivo .m :

test=1.0; progress1.progress = 0.0; [self performSelectorOnMainThread:@selector(makeMyProgressBarMoving) withObject:nil waitUntilDone:NO]; - (void)makeMyProgressBarMoving { NSLog(@"test %f",test); float actual = [progress1 progress]; NSLog(@"actual %f",actual); if (progress1.progress >1.0){ progress1.progress = 0.0; test=0.0; } NSLog(@"progress1.progress %f",progress1.progress); lbl4.text=[NSString stringWithFormat:@" %i %%",(int)((progress1.progress) * 100) ] ; progress1.progress = test/100.00;//actual + ((float)recievedData/(float)xpectedTotalSize); [NSTimer scheduledTimerWithTimeInterval:0.5 target:self selector:@selector(makeMyProgressBarMoving) userInfo:nil repeats:NO]; test++; }


Tuve un problema similar. UIProgressView no se actualizaba aunque sí establecí Progress e incluso probé setNeedsDisplay, etc.

float progress = (float)currentPlaybackTime / (float)totalPlaybackTime; [self.progressView setProgress:progress animated:YES];

Tenía (int) antes del progreso en la parte setProgress. Si llama a setProgress con int, no se actualizará como UISlider. Uno debería llamarlo con valor flotante solo de 0 a 1.