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)
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 metodytableView:cellForRowAtIndexPath:
UITableViewDataSource. Wszystko będzie obsługiwane za Ciebie, od pobierania asynchronicznego po buforowanie zarządzanie.
Hilton
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ę!!!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];
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
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ć.
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