¿Cómo hacer que UIProgressView muestre el progreso de la carga de NSArray desde el file (iPhone)?

Espero que incluso sea posible.

Tengo código para cargar un file realmente grande (dictionary) después de que se inició la aplicación:

- (void)applicationDidFinishLaunching:(UIApplication *)application { NSString *filePath = [NSString stringWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"en_US" ofType:@"txt"] encoding:NSUTF8StringEncoding error:nil]; dictionary = [NSSet setWithArray:[NSArray arrayWithArray: [filePath componentsSeparatedByCharactersInSet: [NSCharacterSet whitespaceAndNewlineCharacterSet]]]]; } 

También tengo el código apropiado en viewDidLoad :

 - (void)viewDidLoad { [super viewDidLoad]; self.progressView.progress = 0.0; [self performSelectorOnMainThread: @selector(applicationDidFinishLaunching:) withObject:nil waitUntilDone:NO]; } 

Pero no tengo ni idea de cómo obligar a UIProgressView a mostrar el progreso de la creación del dictionary NSSet desde un NSArray . Se tarda unos segundos en iOS Simulator, por lo que en el dispositivo puede tomar más de una docena. Realmente necesito mostrar el progreso, y prefiero esta manera que la Vista del indicador de actividad.

Estoy interesado en cómo get el recuento de los artículos importados en este momento (se conoce el conteo de todos los artículos).

¿Alguna idea? 🙂

Debe utilizar NSURLRequest / NSURLConnection para iniciar una request asíncrona para get los datos del dictionary. Los delegates de NSURLConnection le proporcionarán los bytes de lectura y los bytes restantes donde puede realizar un envío asynchronous al hilo principal para actualizar el valor de la vista de progreso.

Si tiene un file de text largo para analizar, las classs de framework tardarán mucho time. No puedes cambiar eso. Y no se puede cambiar que nunca volverán a llamar durante el trabajo para informarle sobre su progreso.

Su única posibilidad es realizar la split de files de text por su count y establecer su progreso a medida que avanza a través de su file de text. Puede dividir un file de text con expresiones regulares. El "\ w +" recoge palabras con al less un carácter.

Si establece la barra de progreso en un método de trabajo pesado, debe darle time para actualizar la pantalla de vez en cuando. Vea la "magia futura" a continuación.

Tal vez lo siguiente puede actuar como un punto de partida: en el código siguiente, el contenido del file de text se almacena en el "contenido" de NSString.

 NSError *error = NULL; NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"\\w+" options:NSRegularExpressionCaseInsensitive error:&error]; [regex enumerateMatchesInString:content options:0 range:NSMakeRange(0, [content length]) usingBlock:^(NSTextCheckingResult *match, NSMatchingFlags flags, BOOL *stop){ // push one match to the dictionary [dictionary addObject:[content substringWithRange:match.range]]; // update the progress bar NSDate* futureDate = [NSDate dateWithTimeInterval:0.001 sinceDate:[NSDate date]]; [[NSRunLoop currentRunLoop] runUntilDate:futureDate]; self.progressbar.progress = (float) match.range.location/content.length; }]; 

Tenga en count que el código no está optimizado para la velocidad. Por ejemplo, no debe actualizar la barra de progreso con cada token. Según cuántas fichas tengas, count las detectadas y actualiza la barra de progreso cada 100 partidos, más o less …

Use SVProgressHUD . Tiene delegates como showProgress para mostrar el progreso.

EDITAR:

Tenga en count que esto es solo una sugerencia para el enfoque y no para la implementación práctica. Dependiendo de su observación, puede o no optar por implementarlo.

Si se trata de un file local, puede calcular conjetura sobre el time total que lleva leer el file completo. Luego divide este time por 100.

Cree una queue asíncrona para leer desde un file usando uno de arrayWithContentsOfFile o dictionaryWithContentsOfFile o lo que sea. Implementa un timer en el hilo principal e incrementa el progreso en 1 a través de él, y sigue publicando el progreso en el hilo principal (no lees el progreso del hilo asíncrono porque nunca lo dirás, lo estamos fingiendo).

Una vez que devuelve arrayWithContentsOfFile , publica el 100% en el hilo principal. Es posible que tenga que ajustar un poco para que sea preciso (como en Windows, donde sigue viendo que el time de descarga del file fluctúa), pero la variación no será mucho, supongo. Cada tipo de dispositivo de destino habría dado hardware y memory, por lo que sería simplemente una function del tamaño del file.