2015-04-08 26 views
6

Moja aplikacja to rodzaj galerii zdjęć. gdy użytkownik kliknie na ikonę w galerii, konieczne będzie wyświetlenie obrazów (Krajobraz 2, Obraz 1). Obrazy mogą być większe niż 100. Zwykle pobierałem surowy plik i dekodowałem do formatu UIImage. Jeśli użytkownik chce zobaczyć inny obraz, jego wyświetlenie zajmuje trochę czasu (opóźnienie) z powodu dekodowania. Więc chcę zapisać niektóre obrazy w pamięci podręcznej (NSArray) w osobnym wątku (GCD), aby rozwiązać ten problem.Konieczność zapisywania i pobierania UIImages za pomocą bufora

W tablicy I może znajdować się od 5 do 10 zdjęć. Należy aktualizować za każdym razem, gdy użytkownik przeciąga.

Uprzejmie proszę podać sugestie.

Z góry dziękuję.

+0

Należy użyć NSCache dla pamięci podręcznej pamięci lub zajrzyj do solutio ns również z pamięcią podręczną dysku. Istnieje wiele implementacji pamięci podręcznej dla obrazów. – Andy

+0

Dzięki Andy. Zrobię to samo. Uprzejmie proszę podać kilka linków do odsyłania, jeśli jest to możliwe. –

+0

@Andy Jeszcze raz dziękuję. Wdrożono NSCache zgodnie z sugestią. to działa dobrze. –

Odpowiedz

2

wypróbować ten -

UIImage *image = [imageCache objectForKey:@"myImage"]; 
    if (!image) 
    { 
     // download image 
     dispatch_async(dispatch_get_global_queue(0, 0), ^{ 
     NSData *imageData = [NSData dataWithContentsOfURL:[NSURL URLWithString:yourURL]]; 
     if (imageData) 
     { 
     // Set image to cache 
     [imageCache setObject: [UIImage imageWithData:imageData] forKey:@"myImage"]; 
     dispatch_async(dispatch_get_main_queue(), ^{ 
     [yourImageView setImage:[UIImage imageWithData:imageData]]; 
     }); 
     } 
    }); 
} 
else 
{ 
    // Use image from cache 
    [yourImageView setImage:image]; 
} 
+0

Dzięki za odpowiedź bracie. 1) Opóźnienie nie jest podczas pobierania, ale dekodowania (inny format do formatu UIImage). 2) dla obrazuCache, który jest dobry (NSArray lub NSMutable Array lub inny) –

0

Możesz użyć LazyTableImages od Apple.

Ten kod pobierze obraz w tle i ustawi go na obraz po zakończeniu pobierania. Możesz dodać obraz zastępczy, dopóki oryginalny obraz nie zostanie pobrany.

Użyłem tego przykładu w wielu aplikacjach, więc mogę również pomóc w implementacji, jeśli jest to wymagane.

Mam nadzieję, że to ci pomoże.

+1

Dzięki za twoją pewność siebie. czy dotyczy to obrazów o wysokiej rozdzielczości? –

3

I wprowadziły NSCache użyciu GCD

dispatch_async(dispatch_get_global_queue(0, 0), ^{ 

    [self storeInCache]; 

     dispatch_async(dispatch_get_main_queue(), ^{ 

      UIImage *image=[_imageCache objectForKey:@"P5"]; 
      self.imageView = [[UIImageView alloc] initWithImage:image]; 
      self.imageView.frame = (CGRect){.origin=CGPointMake(0.0f, 0.0f), .size=image.size}; 
      [self.scrollView addSubview:self.imageView]; 
      self.scrollView.contentSize = image.size; 
    }); 
     }); 

// Store 5 obrazów w NSCache

-(void)storeInCache 
{ 

UIImage *image = [UIImage imageNamed:@"photo1.png"]; 
[_imageCache setObject:image forKey:@"P1"]; 

UIImage *image2 = [UIImage imageNamed:@"photo2.png"]; 
[_imageCache setObject:image2 forKey:@"P2"]; 

UIImage *image3 = [UIImage imageNamed:@"photo3.png"]; 
[_imageCache setObject:image3 forKey:@"P3"]; 

UIImage *image4 = [UIImage imageNamed:@"photo4.png"]; 
[_imageCache setObject:image4 forKey:@"P4"]; 

UIImage *image5 = [UIImage imageNamed:@"photo5.png"]; 
[_imageCache setObject:image5 forKey:@"P5"]; 

}