2010-05-24 4 views
0

J'ai une méthode qui télécharge de manière asynchrone des images. Si les images sont liées à un tableau d'objets (un cas d'utilisation courant dans l'application que je construis), je veux les mettre en cache. L'idée est, je passe dans un numéro d'index (basé sur le indexPath.row de la table que je fais en passant par), et je stocke l'image dans un NSMutableArray statique, claveté sur la ligne de la table que j'ai affaire avec.Variable statique pour la communication entre objets de type similaire

Thusly:

@implementation ImageDownloader 

... 
@synthesize cacheIndex; 

static NSMutableArray *imageCache; 

-(void)startDownloadWithImageView:(UIImageView *)imageView andImageURL:(NSURL *)url withCacheIndex:(NSInteger)index 
{ 
    self.theImageView = imageView; 
    self.cacheIndex = index; 
    NSLog(@"Called to download %@ for imageview %@", url, self.theImageView); 


    if ([imageCache objectAtIndex:index]) { 
     NSLog(@"We have this image cached--using that instead"); 
     self.theImageView.image = [imageCache objectAtIndex:index]; 
     return; 
    } 

    self.activeDownload = [NSMutableData data]; 

    NSURLConnection *conn = [[NSURLConnection alloc] 
      initWithRequest:[NSURLRequest requestWithURL:url] delegate:self]; 
    self.imageConnection = conn; 
    [conn release]; 
} 

//build up the incoming data in self.activeDownload with calls to didReceiveData... 

- (void)connectionDidFinishLoading:(NSURLConnection *)connection 
{ 
    NSLog(@"Finished downloading."); 

    UIImage *image = [[UIImage alloc] initWithData:self.activeDownload]; 
    self.theImageView.image = image; 

    NSLog(@"Caching %@ for %d", self.theImageView.image, self.cacheIndex); 
    [imageCache insertObject:image atIndex:self.cacheIndex]; 
    NSLog(@"Cache now has %d items", [imageCache count]); 

    [image release]; 

} 

Mon index est en train de passer d'accord, je peux voir que par ma sortie NSLog. Mais même après mon insertObject: atIndex: call, [imageCache count] ne laisse jamais zéro.

Ceci est ma première incursion dans les variables statiques, donc je présume que je fais quelque chose de mal.

(Le code ci-dessus est fortement élagué pour ne montrer que la chose principale de ce qui se passe, donc garder cela à l'esprit que vous regardez.)

Répondre

1

Vous semblez jamais initialiser le imageCache et probablement eu de la chance avec il a la valeur 0. L'initialisation serait mieux faite dans l'initialisation de la classe, par exemple:

@implementation ImageDownloader 
// ... 
+(void)initialize { 
    imageCache = [[NSMutableArray alloc] init]; 
} 
// ... 
+0

Huh. Je me suis un peu demandé de l'initialiser. Le faire dans '- (ImageDownloader *) init' était évidemment faux. Je n'ai pas pensé qu'il y avait un initialiseur CLASS. Cela PEUT maintenant fonctionner, sauf que maintenant (correctement, je suppose) je reçois une erreur hors de portée la première fois que je vais 'if ([imageCache objectAtIndex: index]) {'. Pendant que nous sommes là, comment tester conditionnellement un index de tableau dans Obj-C? –

+1

'if (index <[nombre d'imagescache])' –