Что за инициализация это называется - концептуальная?

У меня есть этот фрагмент из примера кода Apple "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 docs говорит это:

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

просто для установки значения nil в объекте.

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

Спасибо

2 ответа

Решение

Эта строка:

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 вернул ноль, т.е. не может найти объект для этого ключа), создайте новый и добавьте его в NSDictionary imageDownloadsInProgress.

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

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

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

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

Другие вопросы по тегам