2015-04-08 14 views
6

Ứng dụng của tôi là một loại thư viện ảnh. khi người dùng nhấp vào biểu tượng trong bộ sưu tập, cần hiển thị hình ảnh (Ảnh 2 ngang, ảnh chân dung 1). Hình ảnh có thể lớn hơn 100. Tôi thường lấy tệp thô và giải mã thành định dạng UIImage. Nếu người dùng muốn nhìn thấy một hình ảnh khác, nó mất một thời gian (chậm trễ) để hiển thị hình ảnh vì giải mã. Vì vậy, tôi muốn lưu một số hình ảnh vào bộ nhớ cache (NSArray) trong một thread riêng biệt (GCD) để giải quyết vấn đề này.Cần lưu và truy xuất UIImages bằng bộ đệm

Trong mảng tôi có thể lưu trữ 5 đến 10 hình ảnh. Cần cập nhật mọi lúc khi người dùng vuốt.

Vui lòng đưa ra đề xuất.

Xin cảm ơn trước.

+0

Bạn nên sử dụng NSCache cho bộ nhớ cache, hoặc nhìn vào solutio ns với bộ nhớ cache đĩa quá. Có rất nhiều triển khai bộ nhớ cache cho hình ảnh. – Andy

+0

Cảm ơn Andy. Tôi sẽ làm giống. Vui lòng cung cấp một số liên kết để tham khảo nếu có thể. –

+0

@Andy Cảm ơn bạn lần nữa. NSCache đã triển khai như bạn đã đề xuất. nó hoạt động tốt. –

Trả lời

2

thử này một -

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

Cảm ơn bạn đã trả lời bro. 1) Sự chậm trễ không phải là trong khi tải xuống nhưng giải mã (định dạng khác sang định dạng UIImage). 2) cho imageCache cái nào tốt (NSArray hoặc NSMutable Array hoặc bất kỳ cái nào khác) –

0

Bạn có thể sử dụng LazyTableImages từ Apple.

Mã này sẽ tải xuống hình ảnh ở chế độ nền và được đặt thành số lần xem khi tải xuống hoàn tất. Bạn có thể thêm hình ảnh giữ chỗ cho đến khi hình ảnh ban đầu của bạn đang trong quá trình tải xuống.

Tôi đã sử dụng mẫu này trong nhiều ứng dụng để tôi cũng có thể giúp bạn thực hiện nếu bạn yêu cầu.

Hy vọng điều này sẽ giúp bạn.

+1

Cảm ơn bạn đã bảo đảm bro. có thể áp dụng cho hình ảnh có độ phân giải cao không? –

3

tôi đã thực hiện NSCache sử dụng 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; 
    }); 
     }); 

// Lưu trữ 5 Hình ảnh thành 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"]; 

}

Các vấn đề liên quan