2012-12-13 25 views
7

Objective-C'ye oldukça yeni geldim, umarım bu her şey anlamlıdır. Görüntüleri bir sunucudan indirdim ve görüntüyü collectionView cellForItemAtIndexPath: yönteminde görüntüledim. Karşılaştığım sorun, görüntülerin önbelleğe alma gibi görünmemesidir. Her hücre yeniden kullanıldığında, sunucudan gelen görüntü yeniden indiriliyor gibi görünüyor. belgeleri okuyarak ve ben bu düşünce benzer soruların yanıtlarını bakarakBir Görüntü ve UICollectionView öğesinin önbelleğe alınması

imageDictionary = [[NSMutableDictionary alloc]initWithCapacity:50.0]; 

artı aşağıdaki kod yeterli olacaktır: Benim viewDidLoad yönteminde

Bir NSMutableDictionary yaratıyorum. Birkaç gündür bu işteyim ve eksik olduğum bir şey olduğunu biliyorum.

#pragma mark - UICollectionView Data Source 
- (NSInteger)collectionView:(UICollectionView *)view numberOfItemsInSection:(NSInteger)section;{ 
    NSLog(@"Begin retrieving photos"); 
    return [self.photos count]; 
} 

-(NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView{ 
    return 1; 
} 

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath;{ 
    CollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"MY_CELL" forIndexPath:indexPath]; 
    cell.imageView.image = nil; 

    if (cell.imageView.image == nil) { 
    dispatch_queue_t downloadQueue = dispatch_queue_create("image downloader", NULL); 
    dispatch_async(downloadQueue, ^{ 
     NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:[[self.photos objectAtIndex:indexPath.row] objectForKey:@"fullimage"]]]; 
     UIImage *image = [UIImage imageWithData:data]; 
     [imageDictionary setObject:image forKey:@"Image"]; 

     dispatch_async(dispatch_get_main_queue(), ^{ 
      cell.imageView.image = [imageDictionary objectForKey:@"Image"]; 
      [cell setNeedsDisplay]; 
     }); 
    }); 
    } 
    return cell; 
} 

Herhangi bir yardım çok takdir edilecektir. Şimdiden teşekkürler.

+2

Her seferinde görüntüyü yeniden indiriyor gibi görünüyor. Collectionview sizin için görüntüleri önbelleğe almaz. Önbelleğe almak için kendi sözlüğünüzü oluşturmanız gerekir. NSCache'ye bakın. – yuf

+0

@yuf Yapacak - teşekkürler! – BrianS

cevap

15

@yuf - yön için tekrar teşekkürler. NSCache, peşindeyim sonuçlara ulaşıyor gibi görünüyor. İşte düzgün çalışan kod. Herhangi birinin benzer bir sorunu varsa, aşağıdakileri orijinal sorum ile karşılaştırabilirsiniz.

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath;{ 
    CollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"MY_CELL" forIndexPath:indexPath]; 

    NSString *imageName = [[self.photos objectAtIndex:indexPath.row] objectForKey:@"fullimage"]; 
    UIImage *image = [imageCache objectForKey:imageName]; 

    if(image){ 

     cell.imageView.image = image; 
    } 

    else{ 

    cell.imageView.image = nil; 

    dispatch_queue_t downloadQueue = dispatch_queue_create("image downloader", NULL); 
    dispatch_async(downloadQueue, ^{ 

     NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:[[self.photos objectAtIndex:indexPath.row] objectForKey:@"fullimage"]]]; 
     UIImage *image = [UIImage imageWithData:data]; 

     dispatch_async(dispatch_get_main_queue(), ^{ 

      cell.imageView.image = image; 

     }); 

     [imageCache setObject:image forKey:imageName]; 
    }); 
    } 

    return cell; 
} 
+5

Bu tam olarak doğru değil çünkü hücreler doğru şekilde yeniden kullanılıyorsa, görüntü yüklendiğinde ve hücre güncellendiğinde mümkün olur, bu model örneğiniz, modelinizdeki başka bir kaydı temsil etmek için kullanılır. Önbelleği güncellemek ve koleksiyon görünümü reloadItemsAtIndexPaths çağırmak için daha iyi ve cellForItemAtIndexPath görüntüyü önbellekten (görünürse) ayarlamak için. – Ants

+0

Ah, mantıklı. Aslında, bu konuya girdim (sadece bir kez ama ne demek istediğini anladım). Teşekkürler! – BrianS

+0

@Ants, eğer kodu ekleyebiliyorsanız, pek çok kişiye (benim dahil) faydalanılacaktır. Teşekkürler. – Satyam

İlgili konular