2013-08-29 31 views
5

Tôi cố gắng để bó tải háo hức của hình ảnh:SDWebImage hình ảnh tải háo hức

for (NSDictionary *s in things) { 
    [manager downloadWithURL:[NSURL URLWithString:s[photo]] 
        options:0 
        progress:nil 
        completed:nil]; 
} 

Nó không tải những hình ảnh này. Tuy nhiên, nếu tôi chuyển vào một khối hoàn thành trống, như vậy:

for (NSDictionary *s in things) { 
    [manager downloadWithURL:[NSURL URLWithString:s[photo]] 
        options:0 
        progress:nil 
        completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished) { }]; 
} 

thì nó hoạt động tốt. Câu hỏi của tôi là: tại sao? Có cách nào tốt hơn để làm điều này? Đi qua một khối trống dường như không đúng với tôi.

Trả lời

18

API bạn đang sử dụng không đúng.

Để tìm nạp trước hình ảnh và lưu trữ chúng trong bộ nhớ cache, hãy sử dụng SDWebImagePrefetcher có nghĩa là cho điều đó.

NSMutableArray * urls = [NSMutableArray arrayWithCapacity:things.count]; 
for (NSDictionary *s in things) { 
    [urls addObject:[NSURL URLWithString:s[photo]]]; 
} 
[[SDWebImagePrefetcher sharedImagePrefetcher] prefetchURLs:urls]; 

Là một lưu ý phụ Tôi đã gửi một yêu cầu kéo - vừa được sáp nhập - để thực thi sự hiện diện của một completedBlock trong API bạn (mis) sử dụng, do đó lập trình viên khác sẽ không bạn rơi vào cùng một sai lầm.

+0

Hoàn hảo, cảm ơn! – 0xSina

+4

FYI, nếu bạn làm điều này nhiều lần mà không có các khối hoàn thành, bạn có thể không muốn sử dụng 'sharedImagePrefetcher', vì nó sẽ hủy các hoạt động tìm nạp trước đang chạy trước khi thực hiện các thao tác mới. Tôi phân bổ một cái mới thay vì sử dụng một trong những chia sẻ trong mã của tôi. –

+0

@EnricoSusatyo rất lớn. Cám ơn giải thích rõ ràng. – kevinl

1

Nếu bạn xem xét cẩn thận tại -[SDWebImageManager downloadWithURL:options:progress:completed:] implementation, bạn sẽ tìm thấy dòng:

if (!url || !completedBlock || (!(options & SDWebImageRetryFailed) && isFailedUrl)) 
{ 
    if (completedBlock) 
    { 
     // Complain about invalid URL, completely irrelevant to us at this point. 
     ... 
    } 
    return operation; 
} 

Vì vậy, có, nó không làm gì nếu completionBlocknil. Tại sao? Có lẽ, các nhà phát triển SDWebImage coi phương pháp đó vô dụng mà không có thông số đó được thông qua. Bạn nên tạo một vấn đề GitHub để hỏi họ.

+1

Nó có ý nghĩa. Nếu bạn không làm gì với hình ảnh, tại sao bạn lại sử dụng nó ngay từ đầu? Họ nên sử dụng một xác nhận tham số để thực thi điều này mặc dù. –

+1

@GabrielePetronella Tôi đồng ý, nhưng cách sử dụng của tôi 0xSina hoàn toàn tự nhiên. Đó là một lỗ hổng thiết kế. – iHunter

+0

Họ nên nêu một ngoại lệ để thông báo cho nhà phát triển. Tôi đang thực hiện một yêu cầu kéo. –

0

SDWebImage đã khắc phục sự cố khối hoàn thành và điều này bây giờ có thể với một dòng duy nhất của Swift:

SDWebImagePrefetcher.shared().prefetchURLs(urlArray) 
Các vấn đề liên quan