Как стать автором
Обновить

Комментарии 18

В таком виде очень маловероятно. Добавьте комментариев в код.
А что именно вам непонятно? Мне казалось что я прокомментировал все неясные места.
Извиняюсь, поторопился с комментарием. Перечитал повнимательнее еще раз, все встало на свои места.
Я все таки добавил комментарии по коду и немного поправил код.
if (delegate != nil) {
    [delegate appImageDidLoad:image index:index]; // Вызываем метод делегата
}

Рантайм сам проверит что указатель не nil, лишняя проверка ни к чему.
Зато в этом варианте можно что-то сделать, если делегат не задан. К примеру освободить память и выдать сообщение в лог.
Ну так вы же ничего и не сделали — зачем лишних код городить «на потом»?
UIImageView *imgView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"images.jpeg"]];
А тут утечка памяти. Хоть бы код через анализатор прогнали перед постом ;)
Ну и небольшой PS: для загрузки картинок отлично подходит EGOImageLoading, советую.
Добавил изменения в код. Спасибо за конструктивные замечания.
По поводу EGOImageLoading — возможно хорошая штука, но есть пару моментов.
Асинхронная загрузка достаточно простая вещь и, для меня, не всегда виден смысл в использовании каких-то сторонних библиотек. Второе — лицензионные соображения. Эта библиотека распространяется по лицензии MIT, что может просто не подойти для какого-то проекта.
Правильная асинхронная работа с делегатами не так очевидна. А тут еще и кеширование.

Насчет MIT – а вы ее текст то читали? :) MIT – это одна из самых «легких» лицензий в плане ограничений.
Если делегат не задан, то будет утечка памяти здесь:
activeDownloadData = nil;
NSLog(@"Can't find delegate for ImageLoader");


А тут:
activeDownloadData = [[NSMutableData data] retain]; // Важный момент - сделать retain
можно компактнее написать так:
activeDownloadData = [NSMutableData new];
У меня в приложении используется нечто подобное. Создаётся впечатление, что на iPad, на прошивке iOS 4.2 и выше загрузка выполняется таки синхронно. При том, что код нормально работает на iOS 3.2. Соответственно приходится извращаться с sendSynchronousRequest и NSThread. Что, в свою очередь, крайне криво работает в iOS 3.2.
3.2 не нужно поддерживать: ее около 1% на рынке.
Поддержка этой версии — не моё решение. Хотя, вроде как, есть пользователи и с iOS 3.2. Если верить багрепортам :)
у нашего приложения процентов 6 использует ios3 на iPad (по всему миру)
В наших проектах это делается приблизительно так:

//ассинхронная подгрузка данных по URL
JFFAsyncOperation loader_ = dataURLResponseLoader( url_ );
//ассинхронная подгрузка и кеширование в проперти NSMutableDictionary с именем images
JFFPropertyPath* property_path_ = [ JFFPropertyPath propertyPathWithName: @"images" key: url_ ]
loader_ = [ self asyncOperationForPropertyWithPath: property_path_ asyncOperation: loader_ ];

//пример использования
[ self.activityIndicatorView startAnimating ];
loader_( nil, nil, ^( id result_, NSError* error_ )
{
  self.imageView.image = result_;
  [ self.activityIndicatorView stopAnimating ];
} );
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории