objective developer apple iphone objective-c

iphone - developer - Carga perezosa en el objetivo C



swift ios documentation (4)

Aquí hay un ejemplo de carga lenta desde la plantilla de Datos Core:

- (NSManagedObjectModel *)managedObjectModel { if (managedObjectModel != nil) { return managedObjectModel; } managedObjectModel = [[NSManagedObjectModel mergedModelFromBundles:nil] retain]; return managedObjectModel; }

La primera vez que se solicita el managedObjectModel , se crea mediante el código. En cualquier momento después de eso, ya existe ( != nil ) y se devuelve. Ese es un ejemplo de carga perezosa. Existen otros tipos, como la carga perezosa de archivos NIB (cargarlos en la memoria solo cuando son necesarios).

Escuché una técnica de carga perezosa bastante útil para aumentar el rendimiento del programa. Estoy desarrollando juegos para iPhone. No estoy seguro de cómo es la forma de aplicar la carga diferida en el objetivo C. ¿Podría alguien mostrarme el ejemplo por favor?

Gracias por adelantado


El patrón general para la carga perezosa es siempre más o menos el mismo:

- (Whatever *)instance { if (_ivar == nil) { _ivar = [[Whatever alloc] init]; } return _ivar; }

  1. En su clase, agregue un ivar del tipo que necesita e inicialícelo en nil en el constructor;
  2. Crea un método getter para ese ivar;
  3. En el getter, prueba de nulo. Si es así, crea el objeto. De lo contrario, simplemente devuélvale la referencia.

En su clase * .h, isDragging_msg y isDecliring_msg estos 2 es el valor BOOL. y Dict_name NSMutableDictionary.

En vista hizo carga

Dict_name = [[NSMutableDictionary alloc] init];

En la celda para la fila en la ruta del índice

if ([dicImages_msg valueForKey:[[msg_array objectAtIndex:indexPath.row] valueForKey:@"image name or image link"]]) { cell.image_profile.image=[dicImages_msg valueForKey:[[msg_array objectAtIndex:indexPath.row] valueForKey:@"image name or image link"]]; } else { if (!isDragging_msg && !isDecliring_msg) { [dicImages_msg setObject:[UIImage imageNamed:@"Placeholder.png"] forKey:[[msg_array objectAtIndex:indexPath.row] valueForKey:@"image name or image link"]]; [self performSelectorInBackground:@selector(downloadImage_3:) withObject:indexPath]; } else { cell.image_profile.image=[UIImage imageNamed:@"Placeholder.png"]; } }

y para descargar la imagen la función es: -

-(void)downloadImage_3:(NSIndexPath *)path { NSAutoreleasePool *pl = [[NSAutoreleasePool alloc] init]; NSString *str=[here Your image link for download]; UIImage *img = [[UIImage alloc] initWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:str]]]; [dicImages_msg setObject:img forKey:[[msg_array objectAtIndex:path.row] valueForKey:@"image name or image link same as cell for row"]]; [tableview performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:NO]; [pl release]; }

y al fin poner estos métodos en tu clase

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate { isDragging_msg = FALSE; [tableview reloadData]; } - (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView { isDecliring_msg = FALSE; [tableview reloadData]; } - (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView { isDragging_msg = TRUE; } - (void)scrollViewWillBeginDecelerating:(UIScrollView *)scrollView { isDecliring_msg = TRUE; }


Esta sería la forma adecuada según Apple . Estoy de acuerdo con ellos por múltiples razones:

  • Una variable static dentro de un método persistirá durante varias llamadas.
  • La función dispatch_once de GDC garantizará que el bloque de código dado solo se ejecutará una vez.
  • Es seguro para los hilos.

C objetivo:

- (AnyClass*)instance { static AnyClass *shared = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ shared = [[AnyClass alloc] init]; }); return shared; }