2009-07-15 55 views
58

Tôi có khoảng 50 ô tùy chỉnh trong số UITableView của mình. Tôi muốn hiển thị hình ảnh và nhãn trong các ô nơi tôi lấy hình ảnh từ URL.Hình ảnh tải lười biếng trong UITableView

Tôi muốn tải một lượng hình ảnh chậm để giao diện người dùng không bị đóng băng trong khi hình ảnh đang được tải. Tôi đã cố gắng nhận được những hình ảnh trong các chủ đề riêng biệt nhưng tôi phải tải mỗi hình ảnh mỗi khi một tế bào trở nên có thể nhìn thấy một lần nữa (Nếu không tái sử dụng các tế bào cho thấy hình ảnh cũ). Ai đó có thể vui lòng cho tôi biết cách sao chép hành vi này.

+0

Tôi muốn có một so sánh hiệu suất của tất cả các thành phần bộ nhớ đệm này. – neoneye

+0

Cách 1: sử dụng cách nsoperationqueue 2: Chặn mã hóa cách 3: thư viện –

Trả lời

-1

Tôi không biết bất kỳ cách nào được tích hợp sẵn để thực hiện việc này nhưng có vẻ như bạn đã làm việc với một chuỗi khác.

Giả sử rằng vấn đề duy nhất còn lại của bạn bây giờ là làm vô hiệu các nội dung của một tế bào khi nó trở lại vào xem bạn nên xem xét:

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath 

Bằng cách thực hiện phương pháp đại biểu này, bạn có thể kiểm tra các nội dung của các tế bào trước nó rút ra để xem liệu nó có cần nội dung mới hay không. Nếu có thì bạn có thể làm trống các nội dung của ô và kích hoạt lại tải luồng của bạn.

Bạn cũng có thể xem xét đăng một số mã.

26

Có một vey tốt chính thức ví dụ ở đây từ Apple: LazyTableImages Tôi nghĩ rằng bạn sẽ tìm ra cách tiếp cận đúng trong đó ....

+0

Tôi phải nói rằng SDWebImage dễ dàng hơn và tối ưu hơn nhiều so với việc cố giải mã những thứ này. Nhưng nếu bạn muốn có một kinh nghiệm học tập để tự mình làm điều này, tôi khuyên bạn nên đọc hướng dẫn của LeMarc thay vì: http://iphonedevelopment.blogspot.com/2010/05/downloading-images-for-table-without.html – JeroenEijkhof

+0

Bảng lười biếng Liên kết hình ảnh được cập nhật: https://developer.apple.com/library/prerelease/content/samplecode/LazyTableImages/Introduction/Intro.html – GoodSp33d

3

tôi muốn đề nghị sẽ cho một NSOperation và làm bất cứ điều gì bạn cần trên một chủ đề khác.

Đây là một lớp học tôi đã viết cho tải hình ảnh:

- (id)initWithTarget:(id)trgt selector:(SEL)sel withImgURL:(NSString *)url { 
    if(self = [super init]) { 
     if(url == nil || [url isEqualToString:@""]) 
      return nil; 
     target = trgt; 
     action = sel; 
     imgURL = [[NSURL alloc] initWithString: url]; 
    } 
    return self; 
} 

- (void)main { 
    [NSThread detachNewThreadSelector:@selector(loadImage) toTarget:self withObject:nil]; 
} 

- (void)loadImage { 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
    UIImage *img = [UIImage imageNamed: @"default_user.png"]; 
    if(![[imgURL absoluteString] isEqualToString: @"0"]) { 
     NSData *imgData = [NSData dataWithContentsOfURL: imgURL]; 
     img = [UIImage imageWithData: imgData]; 
    } 
    if([target respondsToSelector: action]) 
     [target performSelectorOnMainThread: action withObject: img waitUntilDone: YES]; 
    [pool release]; 
} 

- (void)dealloc { 
    [imgURL release]; 
    [super dealloc]; 
} 

Hy vọng rằng sẽ giúp!

2

Bạn cũng có thể thử EGOImageLoading. Ngoài ra còn có một bản demo, trong đó cho thấy làm thế nào để sử dụng nó.

8

Tôi đã tạo một thư viện miễn phí được thiết kế riêng cho việc này ... HJCache. Nó rất dễ sử dụng. iphone-image-cache

+17

SDWebImage thanh lịch hơn nhiều so với HJCache của Mark Johnson. IMHO. Xin lỗi Mark. – fuzz

85

thanh toán SDWebImage

Mục README nói, làm thế nào để sử dụng nó trong ứng dụng của bạn.

+10

Bạn có muốn bỏ phiếu này nhiều hơn không :) Tôi thực sự khuyên bạn nên sử dụng thư viện này vì nó rất nhanh, siêu đơn giản với nhiều phòng để linh hoạt trong cách thực hiện. – JeroenEijkhof

+0

Có ai đã cài đặt thành công này trong xcode 4.2 không? Tôi gặp vấn đề với việc không tìm thấy các tiêu đề công khai. – rjgonzo

+0

Hey cho tôi hiển thị lỗi của nó tại #import mà không được tìm thấy, tôi đã làm theo các bước cho non ARC. –

0

Tôi nghĩ rằng có một cách khác để giải quyết vấn đề đó nếu bạn muốn tải hình ảnh mà sau đó vào đầu thats xem nghĩa

khi -(void)loadView đang tải, sau đó chỉ cần bố trí những hình ảnh này và đưa nó vào một nsarray bây giờ khi ô bảng đang tải sau đó thực hiện chế độ xem của bạn tại ô bảng và theo indexPath.row chỉ cần thay thế các hình ảnh này là hình nền hoặc làm cho chế độ xem phụ của những hình ảnh này trên chế độ xem mới của tablecell sử dụng chỉ số nsarrayindexPath.row ô xem bảng.

+0

Tôi cần chính xác giải pháp này. Nhưng tôi không thể tìm thấy bất kỳ mã nguồn ví dụ nào. Có ai có ví dụ? –

1

lẽ bạn có thể có một thử ALImageView Nó là đơn giản hơn nhiều so với SDWebImage.You chỉ cần hai file nguồn (ALImageView.h/ALImageView.m) .Bạn có thể tái sử dụng xem hình ảnh để tải lại các url khác nhau trong một tableview ô.

  1. Hỗ trợ bộ nhớ cục bộ và bộ nhớ;
  2. Nơi giữ chỗ hỗ trợ;
  3. Hỗ trợ chạm chạm (hành động mục tiêu);
  4. Góc hỗ trợ cho chế độ xem hình ảnh;

Ngoài ra còn có bản trình diễn hay.

16

Hãy thử AFNetworking lớp tải xuống lớp này trong liên kết này https://github.com/AFNetworking/AFNetworking. Thêm tất cả các lớp AFNetworking trong project.Then của bạn chỉ cần nhập khẩu loại này

#import "UIImageView+AFNetworking.h" in your Viewcontroller which contains your Tableview. 

Sau đó, trong cellForRowAtIndexPath: đặt như dưới đây

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    CustomCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"]; 

    if (cell == nil) 
    { 
     cell = [[CustomCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell"]; 
    } 

    [cell.imageView setImageWithURL:[NSURL URLWithString:[UrlArray objectAtIndex:indexPath.row]] placeholderImage:[UIImage imageNamed:@"placeholder.jpg"]]; 
    cell.myLabel.text = [imageNameArray objectAtIndex:indexPath.row]; 

    cell.selectionStyle = UITableViewCellSelectionStyleNone; 

    return cell;  
} 

này tải hình ảnh của bạn cho IMAGExem trong UITableViewCell không đồng bộ. Nó sẽ không tải xuống một lần nữa và một lần nữa trong khi người dùng cuộn Tableview, bởi vì nó có bộ nhớ cache cũng. Sau khi tải xuống hình ảnh của bạn, nó sẽ lưu hình ảnh bằng khóa của imageUrl của bạn. Tôi hy vọng nó hữu ích cho bạn.

1

bạn có thể thử này lazyTableImages,


tôi đã tùy chỉnh lazyTableImages dự án này thành một rất đơn giản (customizeLazyTableImages) và loại bỏ tất cả các mã thêm với một số url tĩnh và các chức danh chỉ này đang tải hình ảnh rất mượt mà và bộ nhớ đệm họ


+0

tôi sử dụng nó là một công việc tuyệt vời. –

2

bạn có thể sử dụng hình ảnh cái tôi button..you có thể tải file nút hình ảnh cái tôi từ github ... thêm vào dự án của bạn ....

thay đổi lớp "nút hình ảnh cái tôi" tại xem hình ảnh trong xib của bạn ...

lười tải được gọi là yêu cầu đồng bộ ..

hình ảnh cái tôi được gọi là yêu cầu không đồng bộ. hình ảnh bản ngã không chờ trả lời .. hiển thị tất cả hình ảnh cùng một lúc ..

0

Bạn có thể sử dụng hàng đợi NSOperation hoặc GCD để tải hình ảnh trong nền.

Nếu bạn không muốn tải ảnh lặp đi lặp lại, bạn có thể sử dụng NSCache hoặc hệ thống tệp để lưu trữ hình ảnh.

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