源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

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

  • 时间:2022-08-04 17:22 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:ios通过按钮点击异步加载图片
比较原始的方法:
[u]复制代码[/u] 代码如下:
AsyncImageView.h: #import <UIKit/UIKit.h> @interface AsyncImageView : UIView {     NSURLConnection* connection;     NSMutableData* data; } - (void)loadImageFromURL:(NSURL*)url; @end AsyncImageView.m: #import "AsyncImageView.h" @implementation AsyncImageView - (id)initWithFrame:(CGRect)frame {     self = [super initWithFrame:frame];     if(self) {         // Initialization code     }     returnself; } - (void)loadImageFromURL:(NSURL*)url {     if(connection!=nil) { [connection release]; }     if(data!=nil) { [data release]; }     NSURLRequest* request = [NSURLRequest requestWithURL:url                                              cachePolicy:NSURLRequestUseProtocolCachePolicy                                          timeoutInterval:60.0];     connection = [[NSURLConnection alloc]                   initWithRequest:request delegate:self]; } - (void)connection:(NSURLConnection *)theConnection     didReceiveData:(NSData *)incrementalData {     if(data==nil) {         data =         [[NSMutableData alloc] initWithCapacity:2048];     }     [data appendData:incrementalData]; } - (void)connectionDidFinishLoading:(NSURLConnection*)theConnection {     [connection release];     connection=nil;     if([[self subviews] count] > 0) {         [[[self subviews] objectAtIndex:0] removeFromSuperview];     }     UIImageView *imageView = [[[UIImageView alloc] initWithImage:[UIImage imageWithData:data]] autorelease];     imageView.contentMode = UIViewContentModeScaleAspectFit;     imageView.autoresizingMask = ( UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight );     [self addSubview:imageView];     imageView.frame = self.bounds;     [imageView setNeedsLayout];     [self setNeedsLayout];     [data release];     data=nil; } - (UIImage*) image {     UIImageView* iv = [[self subviews] objectAtIndex:0];     return[iv image]; } - (void)dealloc {     [connection cancel];     [connection release];     [data release];     [super dealloc]; } @end
方法二:
[u]复制代码[/u] 代码如下:
@interface UIButton (AsyncImage) //size by point - (void)setImageFromURL:(NSString *)urlString adjustToSize:(CGSize)size completion:(void (^)(void))completion logo:(UIImage *)logoImage; @end @implementation UIButton (AsyncImage) - (void)setImageFromURL:(NSString *)urlString adjustToSize:(CGSize)size completion:(void (^)(void))completion logo:(UIImage *)logoImage {     dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{         UIImage *image = nil;         NSURL *url = [NSURL URLWithString:urlString];         NSData *data = [NSData dataWithContentsOfURL:url];         image = [UIImage imageWithData:data];            if (image) {             if (!CGSizeEqualToSize(size, CGSizeZero)) {                 image = [UIImage imageWithCGImage:image.CGImage scale:[self scaleImage:image adjustToSize:size] orientation:image.imageOrientation];             }             if (logoImage) {                 image = [self addLogoImage:logoImage toImage:image];             }             dispatch_async(dispatch_get_main_queue(), ^{                 [self setImage:image forState:UIControlStateNormal];                 completion();             });         }         else {             NSLog(@"async load error.");         }     }); } // 缩放图片以适应按钮大小 - (CGFloat)scaleImage:(UIImage *)image adjustToSize:(CGSize)size {     CGFloat xScale = size.width / image.size.width;     CGFloat yScale = size.height / image.size.height;     return 1.0 / MIN(xScale, yScale); } - (UIImage *)addLogoImage:(UIImage *)logo toImage:(UIImage *)img {     //get image width and height     CGFloat scale = [UIScreen mainScreen].scale;     int w = scale * img.size.width;     int h = scale * img.size.height;     int logoWidth = logo.scale * logo.size.width;     int logoHeight = logo.scale * logo.size.height;     CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();     //create a graphic context with CGBitmapContextCreate     CGContextRef context = CGBitmapContextCreate(NULL, w, h, 8, 4 * w, colorSpace, kCGImageAlphaPremultipliedFirst);     CGContextDrawImage(context, CGRectMake(0, 0, w, h), img.CGImage);     CGContextDrawImage(context, CGRectMake(w - logoWidth, 0, logoWidth, logoHeight), [logo CGImage]);     CGImageRef imageMasked = CGBitmapContextCreateImage(context);     CGContextRelease(context);     CGColorSpaceRelease(colorSpace);     return [UIImage imageWithCGImage:imageMasked scale:scale orientation:img.imageOrientation]; } @end
方法三:
#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
实现文件:
//
// 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
以上所述就是本文的全部内容 了,希望大家能够喜欢。
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部