IOS 다 중 스 레 드 다 중 이미지 다운로드 실현(2)
이번 에는 다 중 스 레 드 로 그림 을 다운로드 하고 저장 하 며 다운로드 에 실 패 했 음 을 감안 하여 자 리 를 차지 하 는 문제(첫 번 째 는 다운로드 에 실패 한 그림)입 니 다.
잡담 은 그만 하고 코드 를 올 려 라.일 부 는 지난번 과 같 기 때문에 여 기 는 다른 것 만 올 린 다.
먼저 효과 도 를 보 여 드 리 겠 습 니 다.
여전히 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 를 실현 하고 소 편 은 여기까지 소개 하 겠 습 니 다.여러분 에 게 도움 이 되 기 를 바 랍 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Swift의 패스트 패스Objective-C를 대체하기 위해 만들어졌지만 Xcode는 Objective-C 런타임 라이브러리를 사용하기 때문에 Swift와 함께 C, C++ 및 Objective-C를 컴파일할 수 있습니다. Xcode는 S...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.