2010-01-08 12 views
20

Oí la técnica de carga diferida 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. ¿Alguien podría mostrarme el ejemplo, por favor?Carga lenta en el objetivo C

Gracias de antemano

+1

Lazy carga qué es exactamente? ¿Estás usando Core Data? De ser así, hay una buena documentación sobre consideraciones de rendimiento. –

Respuesta

28

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

- (Whatever *)instance 
{ 
    if (_ivar == nil) 
    { 
     _ivar = [[Whatever alloc] init]; 
    } 
    return _ivar; 
} 
  1. En su clase, añada una Ivar del tipo que necesita, y que inicializar a cero en el constructor;
  2. Cree un método getter para ese ivar;
  3. En el captador, prueba nulo. Si es así, crea el objeto. De lo contrario, simplemente devuelve la referencia a él.
+0

Si desea poder establecerlo también, ¿puede usar @property y @synthesize?Si es así, ¿qué atributos (p. Ej., No atómicos, fuertes, etc.) asignas las propiedades? – avance

+1

'@ synthesize' ya no es necesario con las últimas versiones de Xcode, pero sí, siempre puedes definir una' @ property' y luego anular el setter y getter en tu implementación de clase. Los atributos (fuerte, débil, etc.) solo deben usarse luego para reflejar su propia implementación; el compilador le mostrará su código en lugar de generar alguno. Espero que esto ayude. –

+0

¿Existen bibliotecas realmente sencillas que lo ayuden a lograrlo? – fatuhoku

6

Aquí hay un ejemplo de carga diferida de la plantilla de la base de datos:

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

La primera vez que la pregunta se hace por managedObjectModel, que es creado por el código. En cualquier momento después de eso, ya existe (!= nil) y acaba de ser devuelto. Ese es un ejemplo de carga lenta. Existen otros tipos, como la carga lenta de archivos NIB (que se cargan en la memoria solo cuando son necesarios).

3

En su * .h clase isDragging_msg y isDecloning_msg estos 2 son valores BOOL. y Dict_name NSMutableDictionary.

En vista se cargó

Dict_name = [[NSMutableDictionary alloc] init]; 

En la celda de 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 la imagen de descarga de 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 por último poner estos métodos en su 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; 
} 
+0

Buen enfoque ........ – Wolverine

3

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

  • Una variable static dentro de un método persistirá en 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 subprocesos.

Objective-C:

- (AnyClass*)instance { 

    static AnyClass *shared = nil; 
    static dispatch_once_t onceToken; 

    dispatch_once(&onceToken, ^{ 
     shared = [[AnyClass alloc] init]; 
    }); 

    return shared; 
}