2017-12-17 121 views
5

Câu hỏi này là vì sự hiểu biết của tôi khi mã của tôi hoạt động tốt. Tôi đã xem xét bên trong SDWebImage, nhưng nó khá lớn và tôi không thể xác định cơ chế hoạt động của câu hỏi. OK, chúng ta hãy nói rằng tôi có một tableview đầy đủ của UIImageViews (một bên trong mỗi tế bào), và tôi gọi SDWebImage Category/Extension trên mỗi người trong số họ đi và lười biếng tải một hình ảnh từ trang web.Hiểu cơ chế được sử dụng bởi SDWebImage khi được sử dụng trong UITableView

Cơ chế nào được sử dụng để cập nhật ô như trên màn hình với hình ảnh mới tải xuống mà không tải lại chế độ xem bảng?

Tôi hỏi điều này vì tôi đã ngạc nhiên khi thấy rằng khi sử dụng phần mở rộng SDWebImage, mỗi hình ảnh imageViews của ô của tôi xuất hiện ngay sau khi hình ảnh tương ứng đã tải xuống.

Tôi đã có ấn tượng rằng tôi phải tải lại bảngViewView, nhưng thay vào đó mỗi ô 'imageView' được tự động cập nhật khi hình ảnh có sẵn!

Tính năng này hoạt động như thế nào? SDWebImage có giữ một tham chiếu đến mỗi ô/imageView mà nó hoạt động không?

Trả lời

3

SDWebImage chèn hình ảnh được nạp vào dụ UIImageView mà tải ben đã truy vấn.

Với UITableViewCell bạn phải có một chút khéo léo để tránh những hình ảnh không phù hợp trong các tế bào của bạn, đây là lý do:

  1. Hãy tưởng tượng bạn yêu cầu hình ảnh cho URL của mục đầu tiên (firstURL) trên topmost ô hiển thị.
  2. Bạn cuộn xuống bảng của mình và những điều sau đây xảy ra:
    • ô trên cùng cũ được sử dụng lại và xuất hiện ở cuối bảng.
    • hình ảnh được truy vấn cho URL của ô cuối cùng (lastURL).
  3. firstURL tải hoàn tất và hình ảnh tương ứng được chèn vào chế độ xem hình ảnh của ô cuối cùng, vì đó là chế độ xem hình ảnh mà truy vấn tải firstURL đã được truy vấn.
  4. lastURL tải xong và hình ảnh tương ứng được chèn vào chế độ xem hình ảnh của ô cuối cùng.

Các bước 3 và 4 có thể trông giống như nhấp nháy nhanh trong chế độ xem hình ảnh.

Để tránh điều đó, bạn cần phải giải quyết việc hủy tải xuống trước đó trong việc thực hiện phương pháp prepareForReuse của lớp con UITableViewCell.

ví dụ:

- (void)prepareForReuse { 
    [super prepareForReuse]; 
    [self.imageView sd_cancelCurrentImageLoad]; 
    self.imageView.image = <placeholder image>; 
} 
2

Nếu bạn đang đề cập UIImageView trong UITableViewCell sau đó bạn có thể kiểm tra SDWebImage đó là một loại lớp UIImageView, vì vậy không cần phải mô tả mà hình ảnh xem ám chỉ cho hình ảnh tải về, như tự mình xác định

Hãy để tôi chỉ cho bạn một lần .. khi chúng tôi yêu cầu hình ảnh bên trong ô như thế này.

[cell.imgBrand sd_setImageWithURL:url completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) { 
    if (error != nil) { 
     NSLog(@"%@", [error localizedDescription]); 
    } 
}]; 

Khi dòng đầu tiên được thực hiện, nó sẽ gọi phương thức bên trong lớp UIImageView+WebCache.h. như bạn có thể thấy rằng lớp đó UIImageView

@implementation UIImageView (WebCache) 

Class For SDWebCache UIImageView

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