Hola a todos, actualmente estoy haciendo una parte de una aplicación que descarga información para un formulario desde un webservice.
Toda la actualizacion funcionaba bien hasta que he puesto el alertView y he intentado actualizar el indicador de item procesado (con el dispatch_async), entonces hay veces que funciona y actualiza todo correctamente y otras que en un item random falla. Seguramente tenga que ver algo con el thread principal y el thread en segundo plano, pero no se bien bien que.
La variable savedItems esta definida como: @property (atomic) unsigned long savedItems;
El error que me da es "Thread 10: EXC_BAD_ACCESS (code=1,address=0x8)" pero no aparece nada de error en el stack. Y la aplicación se queda colgada. Este error, me lo marca a la altura de la creación del NSManagedObject
spoilerif (poblaciones != nil && poblaciones != NULL) {
unsigned long poblaciones_size = [poblaciones count];
for ( unsigned long i=0; i < poblaciones_size; i++) {
NSDictionary *poblacion = [poblaciones objectAtIndex:i];
NSString *identifierStr = [poblacion valueForKey:@"ID_POBLACIO"];
if (identifierStr == nil || identifierStr == NULL ) {
continue; // Si no tiene identificador, pasamos de el
}
NSString *name = [[poblacion valueForKey:@"NOM"] stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
NSString *cf_paisStr = [[poblacion valueForKey:@"CF_NACIONALITAT"] stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
// Comprobamos si es una ID valida
if ([GlobalFunctions isNaturalNumber:identifierStr] == FALSE) {
NSLog(@"Discard Item [%lu]: - X-Identifier [%@] Name: [%@] CF_Nacionalidad: [%@]",i,identifierStr,name,cf_paisStr);
continue;
}
// Comprobamos si la poblacion tiene asignado un pais
if ( [GlobalFunctions isNaturalNumber:cf_paisStr] == FALSE ) {
NSLog(@"Discard Item [%lu]: - Identifier [%@] Name: [%@] X-CF_Nacionalidad: [%@]",i,identifierStr,name,cf_paisStr);
continue;
}
NSNumber *identifier = [NSNumber numberWithInt:[identifierStr intValue]];
NSNumber *cf_pais = [NSNumber numberWithInt:[cf_paisStr intValue]];
NSManagedObject *nsmoPoblacion = [NSEntityDescription insertNewObjectForEntityForName:@"Poblaciones" inManagedObjectContext:context];
[nsmoPoblacion setValue:identifier forKey:@"identifier"];
[nsmoPoblacion setValue:name forKey:@"name"];
[nsmoPoblacion setValue:cf_pais forKey:@"cf_pais"];
self.savedItems++;
dispatch_async(dispatch_get_main_queue(), ^{
// Convertimos a numero el identificador
[progressAlert setMessage:[NSString stringWithFormat:@"Guardant informacio - Poblaciones\n[%lu/%lu]",self.savedItems,self.totalItems]];
});
NSLog(@"Item [%lu]: - Identifier [%@] Name: [%@] CF_Nacionalidad: [%@]",i,identifierStr,name,cf_paisStr);
}
}