2013-01-07 15 views
6

Tôi có một với ba ảnh trên mỗi hàng, được triển khai bằng cách sử dụng UITableView.Đạt được cuộn mượt cho Lưới ảnh với hàng nghìn hình ảnh từ đĩa

Tôi có bộ nhớ trong (sử dụng NSCache) có dung lượng 100 hình ảnh, vì vậy một lần tôi sẽ có tối đa 100 ảnh trong bộ nhớ mặc dù tôi có hàng nghìn ảnh trên đĩa để hiển thị Cái lưới sắt.

Tất cả hình ảnh của tôi là JPEG 4KB-20KB.

Vì vậy, với cơ sở hạ tầng này, các hình ảnh được tải liên tục và được tải xuống từ NSCache khi người dùng cuộn qua lưới ảnh. Với việc di chuyển bình thường mọi thứ có vẻ tốt, tôi nhận được khoảng 55-58 khung hình/giây.

Khi người dùng bắt đầu di chuyển nhanh hơn qua lại, tôi có hai trường hợp:

  1. Nếu tôi tách ra nhiệm vụ tải ảnh từ chủ đề chính, tôi kết thúc thiếu hình ảnh trên lưới điện ảnh, bởi vì tôi các ô được hiển thị trước khi hình ảnh được đọc vào bộ nhớ.

    (UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
         UIImage *image = getImageFromCacheForImagePath:imagePath; 
         dispatch_async(dispatch_get_main_queue(), ^{ 
          cell.leftGridItem.imageView.image = image; 
         }); 
        }); 
    } 
    
  2. Nếu tôi có tác vụ tải hình ảnh trên chủ đề chính, có một đoạn nói lắp. Tôi nhận được khoảng 36-45fps.

    (UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
        UIImage *image = getImageFromCacheForImagePath:imagePath; 
        cell.leftGridItem.imageView.image = image; 
    } 
    

getImageFromCacheForImagePath:imagePath được hình ảnh ngay lập tức từ NSCache nếu nó tồn tại, nếu không, các hình ảnh được tải từ tập tin và được đặt vào NSCache để sử dụng sau, nhưng tôi thiết lập các giới hạn của NSCache 100.

Những điều tôi đã cố gắng/tinh chỉnh:

  1. Tránh clipsToBounds cho xem hình ảnh lưới.
  2. Đang tải hình ảnh lên chủ đề nền.
  3. Sử dụng NSOperation Hàng đợi.
  4. Tải hình ảnh theo lô 100 (công trình, nhưng với việc cuộn nhanh, thời gian tải hình ảnh bị trì hoãn).

Tôi đang cố gắng đạt được cảm giác tương tự như ứng dụng Ảnh gốc.

Đề xuất của bạn được đánh giá cao.

+1

Vui lòng xem lại mã trong câu hỏi của bạn. Việc định dạng cần thiết giúp đỡ, và khi thực hiện đã tiết lộ một số vấn đề (xem mã '^ {' trông giống như nó sẽ bắt đầu một khối mã mới nhưng dường như không chính xác với tôi). Chúng tôi đã cố gắng giúp bạn làm cho nó được định dạng đúng, nhưng nó không thực sự rõ ràng. – ErikE

+0

Tôi tự hỏi nếu họ không tạo hình thu nhỏ ngoại tuyến, như lúc nhập, và sau đó kích thước nhỏ của hình thu nhỏ mang lại cho họ một lợi thế đáng kể cho tải chủ đề chính. –

Trả lời

0

Tôi cũng phải đối mặt với cùng một vấn đề vài ngày trước, vì vậy GitHub là nơi tốt nhất để tìm kiếm các giải pháp nguồn mở, vì vậy hãy thử các liên kết này.

Kiểm tra PF-GridView hoặc DTGridView.

cũng Hãy xem trên AQGridView, How to Write a Custom Image Picker like UIImagePicker,

Chỉ cần làm chút Properties để thao tác theo nhu cầu của chúng tôi và nó hoạt động như một nhà vô địch.

+0

cảm ơn đề xuất, vấn đề đang phải đối mặt là hướng tới việc tải hình ảnh một cách khéo léo và kịp thời từ đĩa vào bộ nhớ để tôi không sử dụng nhiều bộ nhớ nhưng vẫn hiển thị hình ảnh trên chế độ xem lưới với cuộn mượt mà. Cũng giống như ứng dụng Ảnh gốc, thậm chí với hàng nghìn bức ảnh, chúng có thể cuộn mượt mà như thể tất cả các hình ảnh đều nằm trong bộ nhớ. Tôi đang cố gắng tìm ra cách họ xử lý nó. –

0

Tôi đã triển khai bảng cuộn mượt mà với hơn 700 hình ảnh. Chìa khóa không chỉ để tải hình ảnh trong nền mà còn để thay đổi kích thước nó trong nền để hoàn toàn phù hợp với container.Thay đổi kích thước một cách hiệu quả là hoạt động quá nặng để thực hiện nó trong chuỗi giao diện người dùng.