2015-04-08 5 views
6

Meine Anwendung ist eine Art Bildergalerie. Wenn ein Benutzer auf ein Symbol in der Galerie klickt, müssen die Bilder angezeigt werden (Querformat 2, Hochformat 1). Die Bilder können mehr als 100 sein. Normalerweise nehme ich rohe Dateien und dekodiere sie in das UIImage Format. Wenn der Benutzer ein anderes Bild sehen möchte, dauert es einige Zeit (Verzögerung), um das Bild wegen der Decodierung anzuzeigen. Daher möchte ich einige der Bilder im Cache (NSArray) in einem separaten Thread (GCD) speichern, um dieses Problem zu lösen.Müssen Sie speichern und retrive UIImages mit Puffer

Im Array kann ich 5 bis 10 Bilder speichern. Muss jedes Mal aktualisiert werden, wenn der Benutzer wischt.

Bitte geben Sie die Vorschläge.

Vielen Dank im Voraus.

+0

umgesetzt haben, sollten Sie nscache verwenden für den Speicher-Cache, oder schauen Sie in solutio ns auch mit disk cache. Es gibt viele Cache-Implementierungen für Bilder. – Andy

+0

Danke Andy. Ich werde dasselbe tun. Bitte geben Sie einige Links an, um anzugeben, ob dies möglich ist. –

+0

@Andy Nochmals vielen Dank. NSCache wurde wie vorgeschlagen implementiert. es funktioniert gut. –

Antwort

2

versuchen, diese ein -

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

Danke für die Antwort bro. 1) Die Verzögerung besteht nicht beim Herunterladen, sondern beim Decodieren (anderes Format in UIImage Format). 2) für den imageCache welches ist gut (NSArray oder NSMutable Array oder irgendein anderes) –

0

Sie können LazyTableImages von Apple verwenden.

Mit diesem Code wird das Bild im Hintergrund heruntergeladen und nach Abschluss des Downloads auf imageview gesetzt. Sie können ein Platzhalterbild hinzufügen, bis das Originalbild heruntergeladen wird.

Ich habe dieses Beispiel in vielen Anwendungen verwendet, so kann ich Ihnen auch bei der Implementierung helfen, wenn Sie benötigt werden.

Hoffe, das wird Ihnen helfen.

+1

Danke für Ihre Zusicherung bro. ist es für die hochauflösenden Bilder anwendbar? –

3

I nscache mit 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; 
    }); 
     }); 

// Speichere 5 Bilder in 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"]; 

}

Verwandte Themen