UITableView image gcd

 1 if (![[NSFileManager defaultManager] fileExistsAtPath:[path stringByAppendingPathComponent:@"image.png"]])
 2 {
 3     dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH,  0ul);
 4     dispatch_async(queue, ^{
 5         NSString *url=[pat stringByAppendingPathComponent:@"comments.txt"];
 6         NSString *u=[NSString stringWithContentsOfFile:url encoding:NSUTF8StringEncoding error:nil];
 7         NSURL *imageURL=[NSURL URLWithString:u];
 8         NSData *image=[NSData dataWithContentsOfURL:imageURL];
 9         [image writeToFile:[pat stringByAppendingPathComponent:@"image.png"] atomically:YES];
10         dispatch_sync(dispatch_get_main_queue(), ^{
11             UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
 cell.imageView.image=[UIImage imageWithContentsOfFile:[pat stringByAppendingPathComponent:@"image.png"]];
12             cell.imageView.image=[UIImage imageWithContentsOfFile:[pat stringByAppendingPathComponent:@"image.png"]];
13             [cell setNeedsLayout];
14             NSLog(@"Download");
15         });
16     });
17     cell.imageView.image=[UIImage imageNamed:@"placeholder"];
18 }
19 else
20 {
21     NSLog(@"cache");
22     cell.imageView.image=[UIImage imageWithContentsOfFile:[pat stringByAppendingPathComponent:@"image.png"]];
23 }

Rather than capturing the cell you need to capture the index path, then get the cell back using:

UITableViewCell*cell =[tableView cellForRowAtIndexPath:indexPath];

That way, if the cell is now off screen you'll get nil back and the image won't be set on the wrong cell.

The other thing you need to add after your dispatch_async() is a

cell.imageView.image=somePlaceholderImage.

posted on 2012-11-08 17:53  cokecoffe  阅读(426)  评论(0编辑  收藏  举报

导航