Я написал некоторый наивный код (в том смысле, что это синхронные вызовы) для табличного представления, которое содержит эскизы изображений, извлеченных из URL. Код в cellForRowAtIndexPath, который извлекает изображение, выглядит следующим образом:
data = (data == nil)? [[NSData alloc] initWithContentsOfURL:photoThumbPage] : [data initWithContentsOfURL:photoThumbPage];
thumbImg = (thumbImg == nil)? [[UIImage alloc] initWithData:data] : [thumbImg initWithData:data];
Я чувствовал, что может быть ускорение, когда каждый раз не выделяются новые nsdata и uiimage, поэтому я определил их в своем классе. Каждый раз, когда я получаю миниатюру, я хочу проверить, определены ли они, и если они уже есть, я просто инициализирую их снова с другими значениями.
Поскольку я пишу этот вопрос здесь, вы уже можете догадаться, что произошли всевозможные плохие вещи :) Когда я прокручиваю свое табличное представление, иногда две или более записи будут иметь одно и то же изображение, и я получаю некоторые ошибки в консоли которые не вызывают сбой моего приложения, но говорят мне, что мой файл JPEG поврежден.
Если оставить в стороне тот факт, что каждый из этих запросов должен быть асинхронным, и что я действительно должен кэшировать эти результаты, может кто-нибудь сказать мне, где я могу отключиться? Похоже, что если cellForRowAtIndexPath вызывается для каждой видимой ячейки, а мой код является синхронным, то не должно быть никаких причин, по которым переменные nsdata и uiimage должны сохраняться в вызовах (они удаляются методами init). Я поменял эти переменные-члены и каждый раз инициализировал их:
NSData *data_local = [[NSData alloc] initWithContentsOfURL:photoThumbPage];
UIImage *thumbImg_local = [[UIImage alloc] initWithData:data];
и все работает просто отлично. Есть ли смысл выделять повторно используемую переменную-член вместо того, чтобы выделять новые NSData и UIImage каждый раз, когда я хочу загрузить миниатюру? Или это просто рецепт катастрофы? Спасибо за любые комментарии / помощь.