Асинхронный загрузчик изображений - PullRequest
2 голосов
/ 28 октября 2010

Я написал небольшой класс для загрузки изображений с использованием NSURLConnection.Идея состоит в том, чтобы делегировать загрузку этому классу, чтобы не блокировать выполнение.

Поэтому я передаю целевой UIImageView (по ссылке) и URL-адрес функции и начинаю загрузку:

-(void)getImage:(UIImageView**)image formUrl:(NSString*)urlStr
{
    NSLog(@"Downloader.getImage.url.debug: %@",urlStr);
    NSURL *url = [NSURL URLWithString:urlStr];
    NSURLRequest *req = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestReturnCacheDataElseLoad timeoutInterval:5.0];
    [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES];
    NSURLConnection *c = [[NSURLConnection alloc] initWithRequest:req delegate:self];
    [conn addObject:c];
    int i = [conn indexOfObject:c];
    [imgs insertObject:*image atIndex:i];
    [c release];
}

Когда закончите, установите изображение и обновите imageView:

- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
    int i = [conn indexOfObject:connection];

    NSData *rawData = [buffer objectAtIndex:i];
    UIImage *img = [UIImage imageWithData:rawData];
    UIImageView *imgView = [imgs objectAtIndex:i];
    imgView.image = img;

    [imgView setNeedsDisplay];

    [conn removeObjectAtIndex:i];
    [imgs removeObjectAtIndex:i];
    [buffer removeObjectAtIndex:i];

    if ([conn count]==0) {
        [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO];
    }
}

Эта система работает довольно хорошо, но я не могу обновить UIImageView внутри ячеек UITableViewCell, вы понимаете?(на самом деле ячейка обновляется, когда я нажимаю на нее) Есть ли лучший способ реализовать эту функцию?(на самом деле нужны: неблокирующая, кеширующая система)

Ответы [ 5 ]

6 голосов
/ 28 октября 2010

Cesar

Для асинхронной загрузки изображений, кэширования и многопоточной работы я использую класс SDImageCache из http://github.com/rs/SDWebImage. Я также написал свой собственный несколько раз, но этот блестящий, и я бросил всемой старый код удален.

Из документации:

Просто #import заголовок UIImageView+WebCache.h и вызов метода setImageWithURL:placeholderImage: из метода tableView:cellForRowAtIndexPath: UITableViewDataSource.Все будет обработано за вас, от асинхронных загрузок до управления кэшированием.

Hilton

3 голосов
/ 18 октября 2012

Просто следуйте инструкциям:

    1) Download SDWebImage below  And drag to your xcode project. 

Нажмите здесь, чтобы загрузить SDWebImage

   2) Write the following code in your .h file #import "UIImageView+WebCache.h"
   3) Write the following code for your image view 
  [yourImageView setImageWithURL:[NSURL URLWithString:@"www.sample.com/image.png"]];

Это ... вы сделали !!!

1 голос
/ 12 декабря 2012

Используйте SDWebImage просто. Я тоже использую это. Загрузка изображений плавная. Использую код ниже, чтобы показать изображение с URL

[myImageView setImageWithURL:[NSURL URLWithString:@"www.sample.com/image.png"] placeholderImage:[UIImage imageNamed:@"lod.png"] 
success:^(UIImage *image, BOOL cached)
{
    productImageDetails.image = image;
} 
failure:^(NSError *error) {
    productImageDetails.image =[UIImage imageNamed:@"no_image.jpg"];
}];

Успех часть будет отображать изображение из веб-сервиса. И, если какое-либо изображение не удалось загрузить или возникла другая проблема, вы можете просто загрузить свое собственное изображение. В этом примере больше функциональных возможностей. Вы можете просто сослаться на это.

1 голос
/ 21 июня 2012

Эта система работает довольно хорошо, но я не могу обновить UIImageView внутри ячеек UITableViewCell, есть идеи? (на самом деле клетка он обновляется, когда я нажимаю на него) Есть лучший способ реализовать это функциональность? (на самом деле нужно: неблокирование, кэширование система

Вы пытались использовать [tableView reloadData]; Вызовите его в конце метода connectionDidFinishLoading

1 голос
/ 28 ноября 2011
NSAutoreleasePool *pool=[[NSAutoreleasePool alloc]init];
    [img_data setImage:[UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:self.str_url]]]];
    [pool release];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...