Async image downloader

Mam napisać małą klasę do wykonywania pobierania obrazów za pomocą NSURLConnection. Chodzi o delegowanie pobierania do tej klasy, aby uniknąć blokowania wykonania.

Więc przekazuję docelowy UIImageView (przez ref) i adres URL do funkcji i Rozpoczynam pobieranie:

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

Po zakończeniu Ustaw obraz i zaktualizuj 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];
    }
}

Ten system działa całkiem dobrze, ale nie mogę uzyskać aktualizacji interfejsu UIImageView wewnątrz komórek UITableViewCell, jakiś pomysł ? (właściwie komórka jest aktualizowana po kliknięciu na nią) Czy jest lepszy sposób na wdrożenie tej funkcjonalności ? (właściwie potrzeba to: nieblokowanie, system buforowania)

Author: Cesar, 2010-10-28

5 answers

Cesar

Do ładowania obrazów asynchronicznych, buforowania i operacji gwintowanych używam klasy SDImageCache z http://github.com/rs/SDWebImage . pisałem też kilka razy swój własny, ale ten jest genialny i wyrzuciłem cały mój stary kod.

Z jego dokumentacji:

Wystarczy #import nagłówek {[1] } i wywoła metodę setImageWithURL:placeholderImage: z metody tableView:cellForRowAtIndexPath: UITableViewDataSource. Wszystko będzie obsługiwane za Ciebie, od pobierania asynchronicznego po buforowanie zarządzanie.

Hilton

 6
Author: Hiltmon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-10-28 02:05:41

Po prostu wykonaj kroki:

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

Kliknij tutaj, aby pobrać 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"]];
To jest to... udało ci się!!!
 3
Author: VSN,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-04-10 06:04:57
NSAutoreleasePool *pool=[[NSAutoreleasePool alloc]init];
    [img_data setImage:[UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:self.str_url]]]];
    [pool release];
 1
Author: GameLoading,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-28 13:14:42

Ten system działa całkiem dobrze, ale nie mogę uzyskać aktualizacji UIImageView wewnątrz komórek UITableViewCell, jakiś pomysł ? (właściwie komórka jest aktualizowany po kliknięciu na niego) jest lepszy sposób na zaimplementowanie ta funkcjonalność ? (w rzeczywistości potrzebne są: nieblokowanie, buforowanie system

Czy próbowałeś użyć [tableview reloadData]; Wywołanie na końcu metody connectionDidFinishLoading

 1
Author: David,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-06-21 10:58:44

Użyj SDWebImage po prostu. Też go używam. Ładowanie zdjęć gładko. Używam poniższego kodu, aby pokazać obraz z adresu 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"];
}];

część Success wyświetli obraz z webService. A jeśli jakiś obraz nie został załadowany lub jakikolwiek inny problem z awarią, możesz po prostu załadować swój własny obraz. W tym przykładzie jest więcej funkcji. Możesz to polecić.

 1
Author: Praveenkumar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-12-12 09:34:15