2009-07-15 20 views
58

Benim UITableView içinde 50 özel hücreler var. Görselleri URL'lerden aldığım hücrelerde bir resim ve etiket görüntülemek istiyorum.Tembel yükleme görüntüleri UITableView içinde

Görüntü yüklenirken, UI'nin donmaması için, tembel bir görüntü yüklemesi yapmak istiyorum. Görüntüleri ayrı konulara ayırmaya çalıştım ama her görüntü bir hücre tekrar görünür hale geldiğinde her görüntüyü yüklemem gerekiyor (Aksi takdirde hücrelerin yeniden kullanılması eski görüntüleri gösterir). Birisi bana bu davranışı nasıl kopyalayacağını söyler.

+0

Keşke tüm bu önbellekleme bileşenlerinin bir performans karşılaştırması olsaydı. – neoneye

+0

yol 1: nsoperationqueue yolunu kullanın 2: Blok kodlama yolu 3: kütüphane –

cevap

-1

Bunu gerçekleştirmek için yerleşik bir yolun farkında değilim, ancak başka bir iş parçacığı ile çalışan bir şeyiniz var gibi geliyor.

size bakmak gerekir görünümüne geri geldiğinde tek kalan sorun artık bir hücrenin içeriğini geçersiz kıldığı varsayarsak: Daha önce hücrenin içeriğini kontrol edebilir bu temsilci yöntemi uygulayarak

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath 

yeni içeriklere ihtiyaç olup olmadığını görmek için çizer. Eğer yaparsa, hücre içeriğini boşaltabilir ve dişli yüklemenizi tekrar tetikleyebilirsiniz.

Bazı kodları da göndermeyi düşünebilirsiniz. Oraya doğru bir yaklaşım bulacağınızı düşünüyorum LazyTableImages .... Bir NSOperation için gidiş ve seni ne yapıyor öneririm

26

vey Apple resmi örnek burada iyi var Başka bir konuya ihtiyacım var.

Bu benim resim yükleme için yazdığı bir sınıf olduğu:

- (id)initWithTarget:(id)trgt selector:(SEL)sel withImgURL:(NSString *)url { 
    if(self = [super init]) { 
     if(url == nil || [url isEqualToString:@""]) 
      return nil; 
     target = trgt; 
     action = sel; 
     imgURL = [[NSURL alloc] initWithString: url]; 
    } 
    return self; 
} 

- (void)main { 
    [NSThread detachNewThreadSelector:@selector(loadImage) toTarget:self withObject:nil]; 
} 

- (void)loadImage { 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
    UIImage *img = [UIImage imageNamed: @"default_user.png"]; 
    if(![[imgURL absoluteString] isEqualToString: @"0"]) { 
     NSData *imgData = [NSData dataWithContentsOfURL: imgURL]; 
     img = [UIImage imageWithData: imgData]; 
    } 
    if([target respondsToSelector: action]) 
     [target performSelectorOnMainThread: action withObject: img waitUntilDone: YES]; 
    [pool release]; 
} 

- (void)dealloc { 
    [imgURL release]; 
    [super dealloc]; 
} 

Umut yardımcı olur!

+0

SDWebImage'ın bu şeylerin kodunu çözmeye çalışmaktan çok daha kolay ve daha iyi olduğunu söylemek zorundayım. Ancak bunu kendiniz yapmak için bir öğrenme deneyimi istiyorsanız, bunun yerine LeMarc'ın öğreticisini okumanızı öneririz: http://iphonedevelopment.blogspot.com/2010/05/downloading-images-for-table-without.html – JeroenEijkhof

+0

Tembel Tablo Görüntüler Güncellenmiş Bağlantı: https://developer.apple.com/library/prerelease/content/samplecode/LazyTableImages/Introduction/Intro.html – GoodSp33d

2

Ayrıca EGOImageLoading deneyebilirsiniz. Nasıl kullanılacağını gösteren bir demo da var.

8

Sadece bunun için tasarlanmış ücretsiz bir kütüphane yaptım ... HJCache. Kullanımı çok kolay. iphone-image-cache

+17

SDWebImage, Mark Johnson's HJCache'den çok daha zariftir. BENİM NACİZANE FİKRİME GÖRE. Üzgünüm Mark. – fuzz

85

çıkış SDWebImage

README Bölüm uygulamanızda nasıl kullanılacağını söylüyor.

+10

Bunu daha fazla oylamak istiyorum :) Gerçekten de bu kütüphaneyi tavsiye ederim, çünkü hem çok hızlı, hem de çok basit ve basit olması için odanın ne kadar esnek olması gerektiğini anlatıyor. – JeroenEijkhof

+0

Bunu kim başarıyla xcode 4.2'de yükledi? Kamu başlıklarını bulamamakla ilgili sorunlar yaşıyorum. – rjgonzo

+0

Hey benim için #import adresindeki hata gösteriyor, ARC olmayan adımları takip ettim. –

0

Orada düşünüyorum bir nsarray içine -(void)loadView yüklenirken zaman, o zaman sadece

bu görüntüleri tahsis ve götürün demek 'delik başında o resim yüklemek isterseniz bu sorunu çözmek için başka bir yoludur şimdi tablo hücresi yüklendiğinde tablo hücrenizde görünümünüzü yapın ve indexPath.row'a göre nsarray'un bu görüntülerini arka plan görüntüsü olarak değiştirin veya bu görüntülerin alt görünümlerini nsarray dizinini ve indexPath.row'u kullanarak tablecell'in yeni görünümünde görüntüleyin tableview hücresi.

+0

Tam olarak bu çözüme ihtiyacım var. Ama hiçbir örnek kaynak kodu bulamıyorum. Örnek olan var mı? –

1

Belki bir .Bu sadece iki kaynak dosyaları (ALImageView.h/ALImageView.m) .Arzu bir tableview farklı URL'ler yeniden görüntü görünümünü yeniden kullanabilirsiniz ihtiyaç SDWebImage.You çok daha basit olan ALImageView denemek olabilir hücre.

  1. Yerel ve bellek önbelleği desteği;
  2. Destek yer tutucuları;
  3. Dokunma desteği (hedef eylem);
  4. Görüntü görünümü için destek köşesi;

Ayrıca iyi bir demo da var.

16

'u deneyin AFNetworking sınıf bu sınıf bu sınıf https://github.com/AFNetworking/AFNetworking indirin. senin project.Then tüm AFNetworking Ders ekle sadece Ardından cellForRowAtIndexPath bu kategoriyi

#import "UIImageView+AFNetworking.h" in your Viewcontroller which contains your Tableview. 

içe: Bu uyumsuz UITableViewCell yılında imageview için Image indirmek

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    CustomCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"]; 

    if (cell == nil) 
    { 
     cell = [[CustomCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell"]; 
    } 

    [cell.imageView setImageWithURL:[NSURL URLWithString:[UrlArray objectAtIndex:indexPath.row]] placeholderImage:[UIImage imageNamed:@"placeholder.jpg"]]; 
    cell.myLabel.text = [imageNameArray objectAtIndex:indexPath.row]; 

    cell.selectionStyle = UITableViewCellSelectionStyleNone; 

    return cell;  
} 

aşağıda gibi koydu. Önbellek de olduğu için kullanıcı Tableview'ı kaydırırken tekrar ve tekrar indirilmez. Görseliniz indirildikten sonra, görüntüyü imageUrl'nizin anahtarı ile kaydeder. Umarım sizin için yararlıdır.

1

denemek bu lazyTableImages,


ben çok basit biri (customizeLazyTableImages) içine lazyTableImages bu proje özelleştirilmiş ve bazı statik URL'ler ve sadece bu çok sorunsuz görüntüleri yükleniyor başlıklarla tüm ekstra kodları çıkarmış ve edebilirsiniz onlara


+0

bunu kullanıyorum, bu harika ahbap dostum. –

2

sen button..you ... github gelen ego görüntü düğmesi dosyalarını indirmek projenizde ekleyebilirsiniz ego resmi kullanabilirsiniz ....

önbelleğe senin xib görüntü manzaraya

değişim sınıfı "ego görüntü düğmesi" ...

geç yükleme senkron isteği denir ..

ego görüntü uyumsuz bir istek olarak adlandırılır. ego görüntüsü yanıt için beklemeyin.görüntüyü tek seferde görüntüleyin ..

0

Arka planda görüntüleri yüklemek için NSOperation kuyruğunu veya GCD'yi kullanabilirsiniz.

Görüntüyü tekrar tekrar yüklemek istemiyorsanız, görüntüleri depolamak için NSCache veya dosya sistemini kullanabilirsiniz.

İlgili konular