2010-07-12 5 views
0

У меня есть этот фрагмент из кода примера яблока «LazyTableImages». В приведенном ниже коде они инициализируют класс IconDownloader. Так что это за поведение.Какая инициализация называется так называемой концептуальной?

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

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

, а затем

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]; 
    } 

и документы objectForKey говорит, что это:

objectForKey:

Возвращает значение, связанное с данным ключом.

- (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. 

Так я должен поверить, что они устанавливают эту линию

IconDownloader *iconDownloader = [imageDownloadsInProgress objectForKey:indexPath]; 

только для установки всухую значение в объекте.

В конечном счете, вопрос в том, что делает вышеуказанная линия?

благодаря

+0

Непонятно, что вы просите, и форматирование еще более запутывает ваш вопрос. –

+0

@nicolai Это нормально сейчас или все еще неоднозначно? – harshalb

ответ

3

Эта линия:

IconDownloader *iconDownloader = [imageDownloadsInProgress objectForKey:indexPath]; 

не делает новый iconDonwloader. Он просто запрашивает объект imageDownloadsInProgress (который, как я полагаю, является NSDictionary?), Чтобы попытаться получить объект IconDownloader, который соответствует ключу 'indexPath' - текущей строке в таблице.

Этот бит кода:

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]; 
} 

проверяет, если он существует. Если это не так (imageDownloadsInProgress возвратил nil i.e, он не может найти объект для этого ключа), сделайте новый и добавьте его в imageDownloadsInProgress NSDictionary.

Весь этот код означает, что для каждого indexPath (каждая строка в таблице) существует только один объект IconDownloader - он останавливается, пытаясь загрузить значок более одного раза, когда вы прокручиваете таблицу вверх и вниз.

Надеюсь, что это поможет.

+0

Хорошо спасибо. Я понимаю – harshalb

+0

Другими словами, они используют NSDictionary как кэш изображений. Это общий шаблон, который вы увидите в нескольких приложениях. –

+0

@Brad Larson Спасибо, сэр – harshalb

1

imageDownloadsInProgress, по-видимому, является NSMutableDictionary. Этот словарь использовался для хранения экземпляров класса IconDownloader. Экземпляры хранятся в соответствующем indexPath, поэтому легко получить IconDownloader для данной строки в tableView.

Линия, о которой вы спрашиваете, просто делает это. Он извлекает экземпляр IconDownloader для данного indexPath или nil, если IconDownloader не был создан и не хранится в словаре ранее.

 Смежные вопросы

  • Нет связанных вопросов^_^