IOS 다 중 스 레 드 다 중 이미지 다운로드 실현(2)

지난 글 은 여러분 에 게IOS 다 중 스 레 드 다 중 이미지 다운로드 1 실현을 소개 하 였 으 며,본 고 는 계속해서 여러분 에 게 ios 다 중 스 레 드 다운로드 사진 을 소개 합 니 다.
이번 에는 다 중 스 레 드 로 그림 을 다운로드 하고 저장 하 며 다운로드 에 실 패 했 음 을 감안 하여 자 리 를 차지 하 는 문제(첫 번 째 는 다운로드 에 실패 한 그림)입 니 다.
잡담 은 그만 하고 코드 를 올 려 라.일 부 는 지난번 과 같 기 때문에 여 기 는 다른 것 만 올 린 다.
먼저 효과 도 를 보 여 드 리 겠 습 니 다.

여전히 ViewController.m 에 있 습 니 다.
1.

@interface ViewController ()
//    
@property (nonatomic,strong)NSArray *apps;
//      
@property (nonatomic,strong)NSMutableDictionary *imgCache;
/**    */
@property (nonatomic,strong)NSMutableDictionary *operations;
/**    */
@property (nonatomic,strong) NSOperationQueue *queue;
@end 
앞의 두 개 와 앞의 것 이 일치 하 다.
operations 는 다운로드 한 그림 을 저장 하 는 스 레 드 작업 사전 을 사용 하 는데,주요 역할 은 중복 다운로드 방지 입 니 다.
queue 는 다 중 스 레 드 를 사용 할 때 사용 하 는 대기 열 입 니 다.
2.

- (NSOperationQueue *)queue {
if (!_queue) {
_queue = [[NSOperationQueue alloc] init];
//     
_queue.maxConcurrentOperationCount = 3;
}
return _queue;
} 
queue 초기 화 및 제어 서브 스 레 드 최대 3 개
3.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *ID = @"app";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];
DDZApp *app = self.apps[indexPath.row];
cell.textLabel.text = app.name;
cell.detailTextLabel.text = app.download;
//         
UIImage *image = self.imgCache[app.icon];
if (image) {
cell.imageView.image = image;
}else {
//       
//             
NSString *cachesPath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject];
//     
NSString *filename = [app.icon lastPathComponent];
//         
NSString *file = [cachesPath stringByAppendingPathComponent:filename];
//         
NSData *data = [NSData dataWithContentsOfFile:file];
//          
if (data) {
//         
UIImage *image = [UIImage imageWithData:data];
cell.imageView.image = image;
//    (  ) 
self.imgCache[app.icon] = image;
}else {
//    
//    
cell.imageView.image = [UIImage imageNamed:@"place.jpg"];
//          
//           
NSOperation *operation = self.operations[app.icon];
if (operation == nil) {
//          
operation = [NSBlockOperation blockOperationWithBlock:^{
NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:app.icon]];
//      
if(data == nil) {
//    
[self.operations removeObjectForKey:app.icon];
return ;
}
UIImage *image = [UIImage imageWithData:data];
//     
self.imgCache[app.icon] = image;
//         
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
//          
//cell.imageView.image = image;
//            
[tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationNone];
}];
//           
[data writeToFile:file atomically:YES];
//    
[self.operations removeObjectForKey:app.icon];
}];
//       
[self.queue addOperation:operation];
//     
self.operations[app.icon] = operation;
}
}
}
return cell;
}
이번 데 이 터 를 연결 하 는 방법 은 내용 이 좀 많 습 니 다.디 테 일 을 많이 고려 했 지만 논리 와 지난번 의 차이 가 많 지 않 습 니 다.
본 고 에서 소개 한 IOS 다 중 스 레 드 에 대해 다 중 이미지 다운로드 2 를 실현 하고 소 편 은 여기까지 소개 하 겠 습 니 다.여러분 에 게 도움 이 되 기 를 바 랍 니 다!

좋은 웹페이지 즐겨찾기