что за инициализация это называется - концептуальная? - PullRequest
0 голосов
/ 12 июля 2010

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

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 ]

3 голосов
/ 12 июля 2010

Эта строка:

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

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

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

1 голос
/ 12 июля 2010

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

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

...