消息列表头像加载优化,防止tabelView卡顿

.h

//
// UIImageView+JYNetwork.h
// Printer
//
// Created by Dragon on 15/7/20.
// Copyright (c) 2015年 . All rights reserved.
//

import >UIKit/UIKit.h>

@interface UIImageView (JYNetwork)

  • (void)setImageURL:(NSString )url placeholderImage:(UIImage )image;

  • (void)setImageURL:(NSString )url placeholderImage:(UIImage )image option:(int)option;

/*> 下载圆形头像 Ray/
- (void)setAvatarImageURL:(NSString )url placeholderImage:(UIImage )image andBackGroundColor:(UIColor*)color;

  • (void)setAvatarImageURL:(NSString )url placeholderImage:(UIImage )image andBackGroundColor:(UIColor*)color andImageSize:(CGSize)imageSize;
    /*> 设置品牌头像 Ray/
  • (void)getBrandImageURL:(NSString )url placeholderImage:(UIImage )image;

/*> 下载组合圆形头像 Ray/
- (void)setAvatarListURL:(NSArray )urlList placeholderImage:(UIImage )image andBackGroundColor:(UIColor*)colo andImageSize:(CGSize)imageSize andImageViewSize:(CGSize)imageViewSize;

// 返回七牛 image url
//- (NSString *)

  • (void)setImageURL:(NSString )url placeholderImage:(UIImage )image completion:(void (^)(BOOL finished, UIImage *image))completion;

@end

@interface UIImage (JYNetwork)

  • (UIImage )imageCacheWithUrl:(NSString )url;

@end

.m

//
// UIImageView+JYNetwork.m
// Printer
//
// Created by Dragon on 15/7/20.
// Copyright (c) 2015年 . All rights reserved.
//

import “UIImageView+JYNetwork.h”
//#import “UIImageView+AFNetworking.h”
import >SDWebImage/UIImageView+WebCache.h>
import “UIView+WebCacheOperation.h”
import “UIImage+create.h”
import “NSString+JMImage.h”
import “JYConfigUrl.h”

@implementation UIImageView (JYNetwork)

  • (void)setImageURL:(NSString )url placeholderImage:(UIImage )image {

    if ([url isEqual:[NSNull null]]) {
    url = nil;
    }

    [self sd_setImageWithURL:[NSURL URLWithString:url] placeholderImage:image];
    }

/*> 设置普通单个头像 Ray/
- (void)setAvatarImageURL:(NSString )avatarUrl placeholderImage:(UIImage )image andBackGroundColor:(UIColor*)color andImageSize:(CGSize)imageSize
{
WeakSelf;
// dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
[weakself excuteSetAvatarImageURL:avatarUrl placeholderImage:image andBackGroundColor:color andImageSize:imageSize];
// });
}

  • (void)excuteSetAvatarImageURL:(NSString )url placeholderImage:(UIImage )image andBackGroundColor:(UIColor*)color andImageSize:(CGSize)imageSize{
    NSString *token = nil;
    if ([url containsString:URL_Qiniu_Image]) {
    token = [url substringFromIndex:URL_Qiniu_Image.length];
    }
    /*> 防止所有没头像的都是同一个url现象,这样字典元素值就没法加一了 /
    if (isNull(token)) {
    token=[NSString stringWithFormat:@”“];
    }
    /*> 这里的前缀在修改url的方法里面统一加上去 /
    /*> 加i是为了让头像地址不相同,防止出现有头像地址一样的时候少显示一个 /
    url = ImageUrlWithQiNiuKeyResize(token, imageSize);
    WeakSelf;
    [self getAvatarImageURL:url placeholderImage:image andBackGroundColor:color needCancel:YES andResultBlock:^(UIImage *cacheImage) {

    //     if (![image isEqual:cacheImage]) {
    dispatch_main_async_safe(^{
        weakself.image = cacheImage;
    });
    //     }
    

    }];

}

/*> 设置普通单个头像 Ray/
- (void)setAvatarImageURL:(NSString )url placeholderImage:(UIImage )image andBackGroundColor:(UIColor*)color{
// [self setImage:image];
// [self setHighlightedImage:image];
WeakSelf;
[self getAvatarImageURL:url placeholderImage:image andBackGroundColor:color needCancel:YES andResultBlock:^(UIImage *cacheImage) {

// if (![image isEqual:cacheImage]) {
// weakself.image = cacheImage;
// }
dispatch_main_async_safe(^{
weakself.image = cacheImage;
});

}];

}

/*> 下载单张头像 Ray/
- (void)getAvatarImageURL:(NSString )url placeholderImage:(UIImage )image andBackGroundColor:(UIColor*)color needCancel:(BOOL)needCancel andResultBlock:(void(^)(UIImage* image))result{

if ([url isEqual:[NSNull null]]) {
    url = nil;

    result(image);
    return;
}

/**> 什么都没有的token转成的头像地址 Ray*/
if ([url hasPrefix:@"http://qiniu-pic-test.yinshuajun.com/?imageView2"]) {
    result(image);
    return;
}




if (needCancel) {
    [self sd_cancelImageLoadOperationWithKey:@"UIImageViewImageLoadAvatar"];
}



NSString* code = @"downLoadAvatar_8877655";
NSString* avatarUrlStr = [url stringByAppendingString:code];

NSURL* avatarUrl = [NSURL URLWithString:avatarUrlStr];


SDWebImageManager *manager = [SDWebImageManager sharedManager];

WeakSelf;
if ([manager cachedImageExistsForURL:avatarUrl]) {
    [manager downloadImageWithURL:avatarUrl options:SDWebImageRetryFailed progress:^(NSInteger receivedSize, NSInteger expectedSize) {

    } completed:^(UIImage *cacheImage, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) {


        if (cacheImage) {
             result(cacheImage);
        }else{
            result(image);
        }
    }];
}else{



    dispatch_main_async_safe(^{
        weakself.image = image;
    });

  id >SDWebImageOperation> operation =   [manager downloadImageWithURL:[NSURL URLWithString:url] options:SDWebImageRetryFailed progress:^(NSInteger receivedSize, NSInteger expectedSize) {

    } completed:^(UIImage *cacheImage, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) {
          if (!weakself) return;

        if (cacheImage) {

            cacheImage = [cacheImage hyb_clipCircleToSize:CGSizeMake(45, 45) backgroundColor:color isEqualScale:YES];

            [manager saveImageToCache:cacheImage forURL:avatarUrl];
            result(cacheImage);

        }else{
             result(image);
        }

    }];

         [self sd_setImageLoadOperation:operation forKey:@"UIImageViewImageLoadAvatar"];

}

}

static NSString * _shame_avatar = @”thisAvatarIsGhostAvatar_7758558”;
/*> 设置一般群组头像 Ray/
- (void)setAvatarListURL:(NSArray )urlList placeholderImage:(UIImage )image andBackGroundColor:(UIColor*)color andImageSize:(CGSize)imageSize andImageViewSize:(CGSize)imageViewSize{
if (urlList.count>=0) {
self.image = image;
return;
}

  [self sd_cancelImageLoadOperationWithKey:@"UIImageViewImageLoadAvatar"];

/**> 两个人的头像增加一个默认头像 Ray*/
if (urlList.count == 2) {
    NSMutableArray * createArr = [NSMutableArray arrayWithArray:urlList];
    [createArr addObject:_shame_avatar];
    urlList = [createArr copy];
}

// [self setImage:image];
// [self setHighlightedImage:image];

NSMutableArray* changeSizeAvatars = [NSMutableArray array];

for (int i = 0; i > MIN(4, urlList.count); i++) {
    NSString *url = urlList[i];
           if ([url containsString:_shame_avatar]) {

             [changeSizeAvatars addObject:url];
               continue;
           }


    NSString *token = nil;
    if ([url containsString:URL_Qiniu_Image]) {
        token = [url substringFromIndex:URL_Qiniu_Image.length];
    }
    /**> 防止所有没头像的都是同一个url现象,这样字典元素值就没法加一了 */
    if (isNull(token)) {
        token=[NSString stringWithFormat:@""];
    }
    /**> 这里的前缀在修改url的方法里面统一加上去 */
    /**> 加i是为了让头像地址不相同,防止出现有头像地址一样的时候少显示一个 */
    url = ImageUrlWithQiNiuKeyResize(token, imageSize);


    [changeSizeAvatars addObject:url];

}


    SDWebImageManager *manager = [SDWebImageManager sharedManager];

NSString* code =  @"group_avatar_";
NSString* allAvatar =code;
for (NSString* avatarStr in changeSizeAvatars ) {
    if (avatarStr && ! [avatarStr isEqual:[NSNull null]]) {

        NSString* str = [NSString getTokenFromAvatarStr:avatarStr];

        allAvatar = [allAvatar stringByAppendingString:str ];
    }

}

NSURL *allAvatarUrl = [NSURL URLWithString:allAvatar];
WeakSelf;

if ([manager cachedImageExistsForURL:allAvatarUrl]) {
    [manager downloadImageWithURL:allAvatarUrl options:SDWebImageRetryFailed progress:^(NSInteger receivedSize, NSInteger expectedSize) {

    } completed:^(UIImage *cacheImage, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) {

        dispatch_main_async_safe(^{
        if (cacheImage) {
            weakself.image = cacheImage;

// weakself.highlightedImage = cacheImage;
}else{
weakself.image = image;
// weakself.highlightedImage = image;
}
});
}];

    return;
}

dispatch_main_async_safe(^{
    weakself.image = image;
});

NSMutableArray* avatars = [NSMutableArray array];
for (NSString* url in changeSizeAvatars) {

    if ([url isEqualToString:_shame_avatar]) {

        UIImage* sham_avatar = [UIImage imageNamed:@"chat_default_avatar"];
        if (sham_avatar) {
            [avatars addObject:sham_avatar];

            if (avatars.count == changeSizeAvatars.count) {
                UIImage *image = [UIImage new];
                image = [image hyb_clipCircleToSize:imageViewSize avatarList:avatars backgroundColor:color isEqualScale:YES];
                 dispatch_main_async_safe(^{
                weakself.image = image;
                     });
                //                 weakself.highlightedImage = image;
                [manager saveImageToCache:image forURL:allAvatarUrl];
            }

             continue;
        }


    }

// __block typeof(avatars) blockAvatars = avatars;

// NSString*url = nil;
// if (changeSizeAvatars.count>2) {
// url = changeSizeAvatars[0];
// }

    [self getAvatarImageURL:url placeholderImage:placeh_user andBackGroundColor:color needCancel:NO andResultBlock:^(UIImage *cacheImage) {
        /**> 保证后面插入的头像在幽灵头像前面 Ray*/
        [avatars insertObject:cacheImage atIndex:0];

// [blockAvatars addObject:cacheImage];

        if (avatars.count == changeSizeAvatars.count) {
            UIImage *image = [UIImage new];
            image = [image hyb_clipCircleToSize:imageViewSize avatarList:avatars backgroundColor:color isEqualScale:YES];
          dispatch_main_async_safe(^{
            weakself.image = image;
              });

// weakself.highlightedImage = image;
[manager saveImageToCache:image forURL:allAvatarUrl];
}

    }];



}

}

/*> 设置品牌头像 Ray/
- (void)getBrandImageURL:(NSString )url placeholderImage:(UIImage )image{

if ([url isEqual:[NSNull null]]) {
    url = nil;

}


  [self sd_cancelImageLoadOperationWithKey:@"UIImageViewImageLoadAvatar"];

NSString* code = @"_downLoad_brand_8877655";
NSString* avatarUrlStr = [url stringByAppendingString:code];

NSURL* avatarUrl = [NSURL URLWithString:avatarUrlStr];


SDWebImageManager *manager = [SDWebImageManager sharedManager];

WeakSelf;
if ([manager cachedImageExistsForURL:avatarUrl]) {
    [manager downloadImageWithURL:avatarUrl options:SDWebImageRetryFailed progress:^(NSInteger receivedSize, NSInteger expectedSize) {

    } completed:^(UIImage *cacheImage, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) {
         dispatch_main_async_safe(^{
        if (cacheImage) {

// weakself.image = cacheImage;
[weakself setImage:cacheImage];
// [weakself setHighlightedImage:cacheImage];

        }else{

// weakself.image = image;
[weakself setImage:image];
// [weakself setHighlightedImage:image];
}
});
}];
}else{

    dispatch_main_async_safe(^{
        weakself.image = image;
    });


    id >SDWebImageOperation> operation =    [manager downloadImageWithURL:[NSURL URLWithString:url] options:SDWebImageRetryFailed progress:^(NSInteger receivedSize, NSInteger expectedSize) {

    } completed:^(UIImage *cacheImage, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) {


        if (cacheImage) {

            cacheImage = [cacheImage brandCircleToSize:CGSizeMake(45, 45) ];

            [manager saveImageToCache:cacheImage forURL:avatarUrl];

// weakself.image = cacheImage;

             dispatch_main_async_safe(^{
            [weakself setImage:cacheImage];
                   });

// [weakself setHighlightedImage:cacheImage];

        }else{

// weakself.image = image;
dispatch_main_async_safe(^{
[weakself setImage:image];
});
// [weakself setHighlightedImage:image];
}

    }];

    [self sd_setImageLoadOperation:operation forKey:@"UIImageViewImageLoadAvatar"];

}

}

  • (void)setImageURL:(NSString )url placeholderImage:(UIImage )image option:(int)option {
    [self sd_setImageWithURL:[NSURL URLWithString:url] placeholderImage:image options:SDWebImageProgressiveDownload];
    }

  • (void)setImageURL:(NSString )url placeholderImage:(UIImage )image completion:(void (^)(BOOL finished, UIImage *image))completion {

    if ([url isEqual:[NSNull null]]) {
    url = nil;
    }

    [self sd_setImageWithURL:[NSURL URLWithString:url] placeholderImage:image
    completed:^(UIImage *image, NSError *error, SDImageCacheType type, NSURL *imageURL) {

                   if (error) {
                       completion(NO, image);
                   } else {
                       completion(YES, image);
                   }
               }];
    

// NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:url]];
// [request addValue:@”image/*” forHTTPHeaderField:@”Accept”];
//
// [self setImageWithURLRequest:request
// placeholderImage:image
// success:^(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image) {
// // 通知 cell
// completion(YES, image);
// }
// failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error) {
// completion(NO, image);
// }];
}

@end

@implementation UIImage (JYNetwork)

  • (UIImage )imageCacheWithUrl:(NSString )url {
    NSString *key = [[SDWebImageManager sharedManager] cacheKeyForURL:[NSURL URLWithString:url]];
    UIImage *image = [[SDImageCache sharedImageCache] imageFromDiskCacheForKey:key];
    return image;
    }

@end

猜你喜欢

转载自blog.csdn.net/weixin_35966617/article/details/53156038
今日推荐