html5中文学习网

您的位置: 首页 > ios » 正文

ios通过按钮点击异步加载图片_IOS开发

[ ] 已经帮助:人解决问题

   本文给大家汇总了几种IOS中实现异步加载图片的方法,十分的简单实用,有需要的小伙伴可以参考下。j4QHTML5中文学习网 - HTML5先行者学习网

  比较原始的方法:j4QHTML5中文学习网 - HTML5先行者学习网

  代码如下:j4QHTML5中文学习网 - HTML5先行者学习网

  AsyncImageView.h:j4QHTML5中文学习网 - HTML5先行者学习网

  #import j4QHTML5中文学习网 - HTML5先行者学习网

  @interface AsyncImageView : UIViewj4QHTML5中文学习网 - HTML5先行者学习网

  {j4QHTML5中文学习网 - HTML5先行者学习网

  NSURLConnection* connection;j4QHTML5中文学习网 - HTML5先行者学习网

  NSMutableData* data;j4QHTML5中文学习网 - HTML5先行者学习网

  }j4QHTML5中文学习网 - HTML5先行者学习网

  - (void)loadImageFromURL:(NSURL*)url;j4QHTML5中文学习网 - HTML5先行者学习网

  @endj4QHTML5中文学习网 - HTML5先行者学习网

  AsyncImageView.m:j4QHTML5中文学习网 - HTML5先行者学习网

  #import "AsyncImageView.h"j4QHTML5中文学习网 - HTML5先行者学习网

  @implementation AsyncImageViewj4QHTML5中文学习网 - HTML5先行者学习网

  - (id)initWithFrame:(CGRect)framej4QHTML5中文学习网 - HTML5先行者学习网

  {j4QHTML5中文学习网 - HTML5先行者学习网

  self = [super initWithFrame:frame];j4QHTML5中文学习网 - HTML5先行者学习网

  if(self) {j4QHTML5中文学习网 - HTML5先行者学习网

  // Initialization codej4QHTML5中文学习网 - HTML5先行者学习网

  }j4QHTML5中文学习网 - HTML5先行者学习网

  returnself;j4QHTML5中文学习网 - HTML5先行者学习网

  }j4QHTML5中文学习网 - HTML5先行者学习网

  - (void)loadImageFromURL:(NSURL*)url {j4QHTML5中文学习网 - HTML5先行者学习网

  if(connection!=nil) { [connection release]; }j4QHTML5中文学习网 - HTML5先行者学习网

  if(data!=nil) { [data release]; }j4QHTML5中文学习网 - HTML5先行者学习网

  NSURLRequest* request = [NSURLRequest requestWithURL:urlj4QHTML5中文学习网 - HTML5先行者学习网

  cachePolicy:NSURLRequestUseProtocolCachePolicyj4QHTML5中文学习网 - HTML5先行者学习网

  timeoutInterval:60.0];j4QHTML5中文学习网 - HTML5先行者学习网

  connection = [[NSURLConnection alloc]j4QHTML5中文学习网 - HTML5先行者学习网

  initWithRequest:request delegate:self];j4QHTML5中文学习网 - HTML5先行者学习网

  }j4QHTML5中文学习网 - HTML5先行者学习网

  - (void)connection:(NSURLConnection *)theConnectionj4QHTML5中文学习网 - HTML5先行者学习网

  didReceiveData:(NSData *)incrementalData {j4QHTML5中文学习网 - HTML5先行者学习网

  if(data==nil) {j4QHTML5中文学习网 - HTML5先行者学习网

  data =j4QHTML5中文学习网 - HTML5先行者学习网

  [[NSMutableData alloc] initWithCapacity:2048];j4QHTML5中文学习网 - HTML5先行者学习网

  }j4QHTML5中文学习网 - HTML5先行者学习网

  [data appendData:incrementalData];j4QHTML5中文学习网 - HTML5先行者学习网

  }j4QHTML5中文学习网 - HTML5先行者学习网

  - (void)connectionDidFinishLoading:(NSURLConnection*)theConnection {j4QHTML5中文学习网 - HTML5先行者学习网

  [connection release];j4QHTML5中文学习网 - HTML5先行者学习网

  connection=nil;j4QHTML5中文学习网 - HTML5先行者学习网

  if([[self subviews] count] > 0) {j4QHTML5中文学习网 - HTML5先行者学习网

  [[[self subviews] objectAtIndex:0] removeFromSuperview];j4QHTML5中文学习网 - HTML5先行者学习网

  }j4QHTML5中文学习网 - HTML5先行者学习网

  UIImageView *imageView = [[[UIImageView alloc] initWithImage:[UIImage imageWithData:data]] autorelease];j4QHTML5中文学习网 - HTML5先行者学习网

  imageView.contentMode = UIViewContentModeScaleAspectFit;j4QHTML5中文学习网 - HTML5先行者学习网

  imageView.autoresizingMask = ( UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight );j4QHTML5中文学习网 - HTML5先行者学习网

  [self addSubview:imageView];j4QHTML5中文学习网 - HTML5先行者学习网

  imageView.frame = self.bounds;j4QHTML5中文学习网 - HTML5先行者学习网

  [imageView setNeedsLayout];j4QHTML5中文学习网 - HTML5先行者学习网

  [self setNeedsLayout];j4QHTML5中文学习网 - HTML5先行者学习网

  [data release];j4QHTML5中文学习网 - HTML5先行者学习网

  data=nil;j4QHTML5中文学习网 - HTML5先行者学习网

  }j4QHTML5中文学习网 - HTML5先行者学习网

  - (UIImage*) image {j4QHTML5中文学习网 - HTML5先行者学习网

  UIImageView* iv = [[self subviews] objectAtIndex:0];j4QHTML5中文学习网 - HTML5先行者学习网

  return[iv image];j4QHTML5中文学习网 - HTML5先行者学习网

  }j4QHTML5中文学习网 - HTML5先行者学习网

  - (void)dealloc {j4QHTML5中文学习网 - HTML5先行者学习网

  [connection cancel];j4QHTML5中文学习网 - HTML5先行者学习网

  [connection release];j4QHTML5中文学习网 - HTML5先行者学习网

  [data release];j4QHTML5中文学习网 - HTML5先行者学习网

  [super dealloc];j4QHTML5中文学习网 - HTML5先行者学习网

  }j4QHTML5中文学习网 - HTML5先行者学习网

  @endj4QHTML5中文学习网 - HTML5先行者学习网

  方法二:j4QHTML5中文学习网 - HTML5先行者学习网

  复制代码 代码如下:j4QHTML5中文学习网 - HTML5先行者学习网

  @interface UIButton (AsyncImage)j4QHTML5中文学习网 - HTML5先行者学习网

  //size by pointj4QHTML5中文学习网 - HTML5先行者学习网

  - (void)setImageFromURL:(NSString *)urlString adjustToSize:(CGSize)size completion:(void (^)(void))completion logo:(UIImage *)logoImage;j4QHTML5中文学习网 - HTML5先行者学习网

  @endj4QHTML5中文学习网 - HTML5先行者学习网

  @implementation UIButton (AsyncImage)j4QHTML5中文学习网 - HTML5先行者学习网

  - (void)setImageFromURL:(NSString *)urlString adjustToSize:(CGSize)size completion:(void (^)(void))completion logo:(UIImage *)logoImagej4QHTML5中文学习网 - HTML5先行者学习网

  {j4QHTML5中文学习网 - HTML5先行者学习网

  dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{j4QHTML5中文学习网 - HTML5先行者学习网

  UIImage *image = nil;j4QHTML5中文学习网 - HTML5先行者学习网

  NSURL *url = [NSURL URLWithString:urlString];j4QHTML5中文学习网 - HTML5先行者学习网

  NSData *data = [NSData dataWithContentsOfURL:url];j4QHTML5中文学习网 - HTML5先行者学习网

  image = [UIImage imageWithData:data];j4QHTML5中文学习网 - HTML5先行者学习网

  if (image) {j4QHTML5中文学习网 - HTML5先行者学习网

  if (!CGSizeEqualToSize(size, CGSizeZero)) {j4QHTML5中文学习网 - HTML5先行者学习网

  image = [UIImage imageWithCGImage:image.CGImage scale:[self scaleImage:image adjustToSize:size] orientation:image.imageOrientation];j4QHTML5中文学习网 - HTML5先行者学习网

  }j4QHTML5中文学习网 - HTML5先行者学习网

  if (logoImage) {j4QHTML5中文学习网 - HTML5先行者学习网

  image = [self addLogoImage:logoImage toImage:image];j4QHTML5中文学习网 - HTML5先行者学习网

  }j4QHTML5中文学习网 - HTML5先行者学习网

  dispatch_async(dispatch_get_main_queue(), ^{j4QHTML5中文学习网 - HTML5先行者学习网

  [self setImage:image forState:UIControlStateNormal];j4QHTML5中文学习网 - HTML5先行者学习网

  completion();j4QHTML5中文学习网 - HTML5先行者学习网

  });j4QHTML5中文学习网 - HTML5先行者学习网

  }j4QHTML5中文学习网 - HTML5先行者学习网

  else {j4QHTML5中文学习网 - HTML5先行者学习网

  NSLog(@"async load error.");j4QHTML5中文学习网 - HTML5先行者学习网

  }j4QHTML5中文学习网 - HTML5先行者学习网

  });j4QHTML5中文学习网 - HTML5先行者学习网

  }j4QHTML5中文学习网 - HTML5先行者学习网

  // 缩放图片以适应按钮大小j4QHTML5中文学习网 - HTML5先行者学习网

  - (CGFloat)scaleImage:(UIImage *)image adjustToSize:(CGSize)sizej4QHTML5中文学习网 - HTML5先行者学习网

  {j4QHTML5中文学习网 - HTML5先行者学习网

  CGFloat xScale = size.width / image.size.width;j4QHTML5中文学习网 - HTML5先行者学习网

  CGFloat yScale = size.height / image.size.height;j4QHTML5中文学习网 - HTML5先行者学习网

  return 1.0 / MIN(xScale, yScale);j4QHTML5中文学习网 - HTML5先行者学习网

  }j4QHTML5中文学习网 - HTML5先行者学习网

  - (UIImage *)addLogoImage:(UIImage *)logo toImage:(UIImage *)imgj4QHTML5中文学习网 - HTML5先行者学习网

  {j4QHTML5中文学习网 - HTML5先行者学习网

  //get image width and heightj4QHTML5中文学习网 - HTML5先行者学习网

  CGFloat scale = [UIScreen mainScreen].scale;j4QHTML5中文学习网 - HTML5先行者学习网

  int w = scale * img.size.width;j4QHTML5中文学习网 - HTML5先行者学习网

  int h = scale * img.size.height;j4QHTML5中文学习网 - HTML5先行者学习网

  int logoWidth = logo.scale * logo.size.width;j4QHTML5中文学习网 - HTML5先行者学习网

  int logoHeight = logo.scale * logo.size.height;j4QHTML5中文学习网 - HTML5先行者学习网

  CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();j4QHTML5中文学习网 - HTML5先行者学习网

  //create a graphic context with CGBitmapContextCreatej4QHTML5中文学习网 - HTML5先行者学习网

  CGContextRef context = CGBitmapContextCreate(NULL, w, h, 8, 4 * w, colorSpace, kCGImageAlphaPremultipliedFirst);j4QHTML5中文学习网 - HTML5先行者学习网

  CGContextDrawImage(context, CGRectMake(0, 0, w, h), img.CGImage);j4QHTML5中文学习网 - HTML5先行者学习网

  CGContextDrawImage(context, CGRectMake(w - logoWidth, 0, logoWidth, logoHeight), [logo CGImage]);j4QHTML5中文学习网 - HTML5先行者学习网

  CGImageRef imageMasked = CGBitmapContextCreateImage(context);j4QHTML5中文学习网 - HTML5先行者学习网

  CGContextRelease(context);j4QHTML5中文学习网 - HTML5先行者学习网

  CGColorSpaceRelease(colorSpace);j4QHTML5中文学习网 - HTML5先行者学习网

  return [UIImage imageWithCGImage:imageMasked scale:scale orientation:img.imageOrientation];j4QHTML5中文学习网 - HTML5先行者学习网

  }j4QHTML5中文学习网 - HTML5先行者学习网

  @endj4QHTML5中文学习网 - HTML5先行者学习网

  方法三:j4QHTML5中文学习网 - HTML5先行者学习网

  ?j4QHTML5中文学习网 - HTML5先行者学习网

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#import <Foundation/Foundation.h>
#import "StringUtils.h"
 
@interface ImageManager : NSObject
{
NSMutableDictionary *_imageDict;
NSMutableArray *_imageArr;
}
 
@property(nonatomic, strong) NSString *httpUrl;
@property(nonatomic, strong) NSMutableDictionary *imageDict;
 
@property(nonatomic, assign) dispatch_queue_t networkQueue;
 
+ (ImageManager *) sharedInstance;
 
 
- (void)asyncImage:(NSString *)imageName imageView:(UIImageView *)imageView;
//插队
- (void)asyncImageInsert:(NSString *)imageName imageView:(UIImageView *)imageView insert:(BOOL)insert;
//不要在下载之前的数据
- (void)asyncImageCleanOld:(NSString *)imageName imageView:(UIImageView *)imageView cleanOld:(BOOL)cleanOld;
 
@end

  实现文件:j4QHTML5中文学习网 - HTML5先行者学习网

  ?j4QHTML5中文学习网 - HTML5先行者学习网

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
//
// ImageManager.m
// myb-ios
//
// Created by warrior gao on 13-6-5.
// Copyright (c) 2013年 51myb. All rights reserved.
//
 
#import "ImageManager.h"
 
@interface ImageManager()
 
@end
 
@implementation ImageManager
 
//缓存图片的最大数量
static int counter = 0;
 
@synthesize imageDict = _imageDict;
 
//Singleton
+ (ImageManager *)sharedInstance
{
static id instance;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
instance = self.new;
});
return instance;
}
 
- (id)init
{
if((self = [super init]))
{
self.networkQueue = dispatch_queue_create("com.warrior.network.image", nil);
_imageDict = [[NSMutableDictionary alloc] init];
_imageArr = [[NSMutableArray alloc] init];
}
return self;
}
 
- (NSString *) fileFullPath:(NSString *)fileName
{
NSString *cachePath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) objectAtIndex:0];
 
NSString *fileFullPath = [NSString stringWithFormat:@"%@/%@",cachePath,fileName];
 
return fileFullPath;
}
 
//不要在下载之前的数据
- (void)asyncImageCleanOld:(NSString *)imageName imageView:(UIImageView *)imageView cleanOld:(BOOL)cleanOld
{
if(cleanOld)
{
[_imageArr removeAllObjects];
}
 
[self asyncImage:imageName imageView:imageView];
}
 
//插队,优先
- (void)asyncImageInsert:(NSString *)imageName imageView:(UIImageView *)imageView insert:(BOOL)insert
{
if([StringUtils isEmpty:imageName]){
return;
}
 
NSData *data = [NSData dataWithContentsOfFile:[self fileFullPath:[imageName stringByReplacingOccurrencesOfString:@"/" withString:@"-"]]];
if(data == nil){
[_imageDict setValue:imageView forKey:imageName];
if(insert)
{
[_imageArr insertObject:imageName atIndex:0];
}
else
{
[_imageArr addObject:imageName];
}
 
[self cacheImage];
} else {
[imageView setImage:[UIImage imageWithData:data]];
}
}
 
//正常,附加到后面
- (void)asyncImage:(NSString *)imageName imageView:(UIImageView *)imageView
{
[self asyncImageInsert:imageName imageView:imageView insert:NO];
}
 
//异步缓存图片到本地,最多有两个线程
-(void)cacheImage
{
for (; counter < 2 && _imageArr.count > 0; counter++)
{
NSString *imageName = nil;
@synchronized(self){
imageName = [[_imageArr objectAtIndex:0] copy];
[_imageArr removeObjectAtIndex:0];
}
 
if(imageName == nil) continue;
 
dispatch_async(self.networkQueue, ^{
 
NSLog(@"Starting: %@", imageName);
UIImage *avatarImage = nil;
NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"%@%@",self.httpUrl, imageName]];
NSData *responseData = [NSData dataWithContentsOfURL:url];
if(responseData.length > 0)
{
[responseData writeToFile:[self fileFullPath:[imageName stringByReplacingOccurrencesOfString:@"/" withString:@"-"]] atomically:NO];
avatarImage = [UIImage imageWithData:responseData];
NSLog(@"Finishing: %@", imageName);
 
if (avatarImage) {
dispatch_async(dispatch_get_main_queue(), ^{
UIImageView *imageView = [_imageDict objectForKey:imageName];
if(imageView != nil && avatarImage != nil){
[imageView setImage:avatarImage];
}
 
[_imageDict removeObjectForKey:imageName];
[imageName release];
});
}
}
counter--;
[self cacheImage];
});
 
}
}
 
@end

  以上所述就是本文的全部内容 了,希望大家能够喜欢。j4QHTML5中文学习网 - HTML5先行者学习网

(责任编辑:)
推荐书籍
推荐资讯
关于HTML5先行者 - 联系我们 - 广告服务 - 友情链接 - 网站地图 - 版权声明 - 人才招聘 - 帮助