2010-07-12 4 views
0

J'ai cet extrait de l'exemple de code Apple "LazyTableImages". Dans le code ci-dessous, ils initialisent la classe IconDownloader. Alors quel genre de comportement est-ce.quel type d'initialisation est-ce appelé - conceptuel?

*************************This Line ****************************************** 
    IconDownloader *iconDownloader = [imageDownloadsInProgress objectForKey:indexPath]; 

************************************************************************** 

puis

if (iconDownloader == nil) 
    { 
     iconDownloader = [[IconDownloader alloc] init]; 
     iconDownloader.CustomObject = CustomObject; 
     iconDownloader.indexPathInTableView = indexPath; 
     iconDownloader.delegate = self; 
     [imageDownloadsInProgress setObject:iconDownloader forKey:indexPath]; 
     [iconDownloader startDownload]; 
     [iconDownloader release]; 
    } 

et objectForKey docs dit ceci:

objectForKey:

Renvoie la valeur associée à une clé donnée.

- (id)objectForKey:(id)aKey 
Parameters 

aKey 

    The key for which to return the corresponding value. 

Return Value 

The value associated with aKey, or nil if no value is associated with aKey. 
Availability 

    * Available in iPhone OS 2.0 and later. 

Alors dois-je croire qu'ils mettent cette ligne

IconDownloader *iconDownloader = [imageDownloadsInProgress objectForKey:indexPath]; 

juste pour le réglage de la valeur nulle dans l'objet. En fin de compte, la question est de savoir ce que fait la ligne ci-dessus.

grâce

+0

Ce que vous demandez n'est pas clair et le formatage obscurcit encore plus votre question. –

+0

@nicolai Est-ce que ça va maintenant ou est encore ambigu? – harshalb

Répondre

3

Cette ligne:

IconDownloader *iconDownloader = [imageDownloadsInProgress objectForKey:indexPath]; 

ne fait pas une nouvelle iconDonwloader. Il s'agit simplement de demander à l'objet imageDownloadsInProgress (que je suppose être un NSDictionary?) D'essayer d'obtenir l'objet IconDownloader qui coprrespond à la clé 'indexPath' - la ligne courante dans la table.

Ce bit de code:

if (iconDownloader == nil) 
{ 
    iconDownloader = [[IconDownloader alloc] init]; 
    iconDownloader.CustomObject = CustomObject; 
    iconDownloader.indexPathInTableView = indexPath; 
    iconDownloader.delegate = self; 
    [imageDownloadsInProgress setObject:iconDownloader forKey:indexPath]; 
    [iconDownloader startDownload]; 
    [iconDownloader release]; 
} 

vérifie si elle existe. Si ce n'est pas le cas (l'imageDownloadsInProgress n'a renvoyé aucun élément, c'est-à-dire qu'il ne peut pas trouver d'objet pour cette clé), créez-en une nouvelle et ajoutez-la au NSDictionary imageDownloadsInProgress. Tout ce code signifie que pour chaque chemin d'index (chaque ligne de la table), il n'y a plus qu'un seul objet IconDownloader - il vous a empêché de télécharger l'icône plus d'une fois lorsque vous faites défiler la table vers le haut et vers le bas.

Espérons que ça aide.

+0

Ok merci. Je comprends – harshalb

+0

En d'autres termes, ils utilisent le NSDictionary comme un cache d'images. C'est un modèle commun que vous verrez dans plus de quelques applications. –

+0

@Brad Larson Merci monsieur – harshalb

1

imageDownloadsInProgress semble être un NSMutableDictionary. Ce dictionnaire utilisé pour contenir des instances de la classe IconDownloader. Les instances sont stockées sous l'indexPath correspondant, il est donc facile d'obtenir IconDownloader pour une ligne donnée dans la tableView.

La ligne sur laquelle vous posez la question fait juste cela. Il récupère une instance IconDownloader pour un indexPath ou un nil donné, si un IconDownloader n'a pas été instancié et stocké dans le dictionnaire auparavant.

Questions connexes