IOS 다 중 스 레 드 다 중 이미지 다운로드 실현(1)
여러분 은 이 화면 이 매우 간단 하 다 는 것 을 볼 수 있 습 니 다.사실은 UITableView 의 구조 입 니 다.그러나 어 려 운 점 은 인터넷 에서 이 그림 들 을 어떻게 다운로드 하고 다운로드 한 후에 어떻게 저장 해 야 하 는 지 입 니 다!
한 걸음 한 걸음 분석 합 니 다.먼저 단일 스 레 드(메 인 스 레 드)에서 여러 그림 을 다운로드 하여 레이아웃 에 있 는 텍스트 와 그림 의 주 소 를 plist 파일 에서 읽 습 니 다.
구조 에 따라 데이터 모델 파일 을 사용자 정의 합 니 다.
DDZApp.h
#import <Foundation/Foundation.h>
@interface DDZApp : NSObject
//
@property (nonatomic,strong) NSString *icon;
//
@property (nonatomic,strong) NSString *name;
//
@property (nonatomic,strong) NSString *download;
+ (instancetype)appWithDict:(NSDictionary *)dict;
@end
DDZApp.m
#import "DDZApp.h"
@implementation DDZApp
+ (instancetype)appWithDict:(NSDictionary *)dict {
DDZApp *app = [[self alloc] init];
[app setValuesForKeysWithDictionary:dict];
return app;
}
@end
아래 는 모두 보기 컨트롤 러 의 코드 입 니 다.ViewController.m
1.
@interface ViewController ()
//
@property (nonatomic,strong)NSArray *apps;
//
@property (nonatomic,strong)NSMutableDictionary *imgCache;
@end
첫 번 째 속성 은 plist 파일 의 내용 을 읽 는 데 사 용 됩 니 다.속성 으로 저장 하면 중복 읽 지 않 아 도 됩 니 다.두 번 째 속성 은 인터넷 에서 다운로드 한 그림 을 저장 하 는 데 사용 되 며,중복 읽 지 않 아 도 된다.
2.
@implementation ViewController
//
- (NSArray *)apps {
if (!_apps) {
// plist
NSArray *dictArray = [NSArray arrayWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"apps.plist" ofType:nil]];
NSMutableArray *appArray = [NSMutableArray array];
for (NSDictionary *dict in dictArray) {
[appArray addObject:[DDZApp appWithDict:dict]];
}
_apps = appArray;
}
return _apps;
}
//
- (NSMutableDictionary *)imgCache {
if (!_imgCache) {
//
_imgCache = [NSMutableDictionary dictionary];
}
return _imgCache;
}
이 두 가지 방법 은 모두 아까 의 두 속성 을 초기 화하 기 위 한 것 이다.3.
#pragma mark -
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return self.apps.count;
}
- (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) {
//
cell.imageView.image = [UIImage imageWithData:data];
// ( )
self.imgCache[app.icon] = cell.imageView.image;
}else {
//
data = [NSData dataWithContentsOfURL:[NSURL URLWithString:app.icon]];
cell.imageView.image = [UIImage imageWithData:data];
//
self.imgCache[app.icon] = cell.imageView.image;
//
[data writeToFile:file atomically:YES];
}
}
return cell;
}
이 두 가지 방법 은 UITableView 가 반드시 실현 해 야 하 는 방법 입 니 다.첫 번 째 는 데 이 터 량 을 되 돌려 주 는 것 이 라 할 말 이 없다.
두 번 째 는 바 인 딩 데이터 입 니 다.
구체 적 인 절 차 는 다음 그림 을 보십시오.
이상 의 내용 은 IOS 다 중 스 레 드 에 대해 다 중 이미지 다운로드(1)를 실현 하 는 것 과 관련 된 소 개 를 하고 여러분 에 게 도움 이 되 기 를 바 랍 니 다.다음 글 은 계속 소개 해 드 리 겠 습 니 다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에 따라 라이센스가 부여됩니다.