iOS学习----------SDWebImage框架解析(1)

1、SDWebImage简单使用

先看demo中的例子,我们从例子出发解析SDWebImage.

[cell.imageView sd_setImageWithURL:[NSURLURLWithString:[_objectsobjectAtIndex:indexPath.row]]
                      placeholderImage:[UIImageimageNamed:@"placeholder"]options:indexPath.row ==0 ? SDWebImageRefreshCached : 0];
这个我就不多解释了,直接看这个方法的调用
@implementation UIImageView (WebCache)
...
-(void)sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options
...
这个方法就是为UIImageView中添加category,继续向里查看

- (void)sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options progress:(SDWebImageDownloaderProgressBlock)progressBlock completed:(SDWebImageCompletionBlock)completedBlock {
    
1、    [selfsd_cancelCurrentImageLoad];
    
    objc_setAssociatedObject(self, &imageURLKey, url,OBJC_ASSOCIATION_RETAIN_NONATOMIC);

   SDWebImageDelayPlaceholder图片在下载过程中的imageView将现实placeholder,表示图片下载的状态
dispatch_main_async_safe宏:如果当前是主线程就在主线程操作block 如果不是主线程就切换到主线程操作block
    if (!(options &SDWebImageDelayPlaceholder)) { 
        dispatch_main_async_safe(^{
            self.image = placeholder;
        });
    }
    
    if (url) {

        // check if activityView is enabled or not
是否需要显示菊花控件,如果需要就添加
        if ([selfshowActivityIndicatorView]) {
            [selfaddActivityIndicator];
        }

        __weak __typeof(self)wself =self;
        id <SDWebImageOperation> operation = [SDWebImageManager.sharedManagerdownloadImageWithURL:urloptions:options progress:progressBlockcompleted:^(UIImage *image,NSError *error, SDImageCacheType cacheType,BOOL finished,NSURL *imageURL) {
移除菊花控件
            [wself removeActivityIndicator];
            if (!wself) return;
            dispatch_main_sync_safe(^{
                if (!wself) return;
如果图片下载完成,并且状态 需要对图片进行处理(模糊、滤镜等),用SDWebImageAvoidAutoSetImage 调用这个completedBlock
                if (image && (options & SDWebImageAvoidAutoSetImage) && completedBlock)
                {
                    completedBlock(image, error, cacheType, url);
                    return;
                }
图片下载完成对imageView设置图片
                else if (image) { 
                    wself.image = image;
刷新界面
                    [wself setNeedsLayout];
已经从网络获取图片但是没有成功那么加载placeholder
                } else {
                    if ((options & SDWebImageDelayPlaceholder)) {
                        wself.image = placeholder;
                        [wself setNeedsLayout];
                    }
                }
图片下载完成后调用的block
                if (completedBlock && finished) {
                    completedBlock(image, error, cacheType, url);
                }
            });
        }];

封装成的opration放入到sd_setImageLoadOperation下面会有对sd_setImageLoadOperation的解释
        [selfsd_setImageLoadOperation:operationforKey:@"UIImageViewImageLoad"];
    } else {
        dispatch_main_async_safe(^{
            [selfremoveActivityIndicator];
            if (completedBlock) {
                NSError *error = [NSErrorerrorWithDomain:SDWebImageErrorDomaincode:-1userInfo:@{NSLocalizedDescriptionKey :@"Trying to load a nil url"}];
                completedBlock(nil, error, SDImageCacheTypeNone, url);
            }
        });
    }
}



这就是这个方法里面的完整代码,我们一句一句来解释

[self sd_cancelCurrentImageLoad]
******************************************
按字面意思就是取消掉当前正在下载的operation,这个方法其实就是调用的
    [selfsd_cancelImageLoadOperationWithKey:@"UIImageViewImageLoad"];源码
- (void)sd_cancelImageLoadOperationWithKey:(NSString *)key {
    // Cancel in progress downloader from queue
    NSMutableDictionary *operationDictionary = [selfoperationDictionary];
    id operations = [operationDictionary objectForKey:key];
    if (operations) {
        if ([operations isKindOfClass:[NSArray class]]) {
            for (id <SDWebImageOperation> operationin operations) {
                if (operation) {
                    [operation cancel];
                }
            }
        } else if ([operationsconformsToProtocol:@protocol(SDWebImageOperation)]){
            [(id<SDWebImageOperation>) operationscancel];
        }
        [operationDictionary removeObjectForKey:key];
    }
}


先获取operation序列,就是一个字典[self operationDictionary]
- (NSMutableDictionary *)operationDictionary {
    NSMutableDictionary *operations =objc_getAssociatedObject(self, &loadOperationKey);
    if (operations) {
        return operations;
    }
    operations = [NSMutableDictionary dictionary];
    objc_setAssociatedObject(self, &loadOperationKey, operations,OBJC_ASSOCIATION_RETAIN_NONATOMIC);
    return operations;
}
**关于objc_getAssociatedObject和objc_setAssociatedObject的使用请转我的博客

通过key值获取到的是operations数组 然后遍历所有的operation进行取消 然后将key从字典中移除

*********************************************************

sd_setImageLoadOperation
**************************************
- (void)sd_setImageLoadOperation:(id)operation forKey:(NSString *)key {
取消下载并移除operation同上面的一样
    [selfsd_cancelImageLoadOperationWithKey:key];
获取operation字典序列
   NSMutableDictionary *operationDictionary = [selfoperationDictionary];
将当前的operation添加到序列中
    [operationDictionarysetObject:operationforKey:key];
}

**************************************





内容概要:本文围绕“考虑电动汽车聚合可调节能力的含波动性电源电氢耦合系统多目标优化运行”展开研究,提出了一种基于Matlab代码实现的多目标优化模型。该模型深度融合电-氢耦合系统与高比例波动性可再生能源(如风电、光伏),充分挖掘电动汽车(EV)集群作为移动储能单元的灵活调节潜力,通过聚合调控提升系统对新能源的消纳能力与运行经济性。研究系统构建了电动汽车可调度能力、电解水制氢与储氢动态过程、多能源协同互补的优化调度框架,并结合智能优化算法实现经济性、低碳性与运行稳定性等多重目标的协同优化。文中配套提供了完整的Matlab仿真代码、相关数据及可能的论文支撑材料,极大地方便了模型的复现、验证与后续深化研究。; 适合人群:具备电力系统、综合能源系统、优化理论或新能源技术等相关领域基础知识的研究生、科研人员,以及从事新型电力系统规划、清洁能源消纳与智慧能源管理的工程技术人员。; 使用场景及目标:①开展高渗透率可再生能源接入下的综合能源系统多目标优化调度研究;②探究电动汽车集群在电网削峰填谷、平抑新能源出力波动及提供辅助服务方面的应用价值与潜力;③学习并掌握电氢耦合系统的建模方法、多目标优化求解技术及其在Matlab/Simulink环境下的仿真实现流程。; 阅读建议:此资源不仅提供可运行的代码,更蕴含了前沿的科研思路与创新方法,建议读者结合所提供的代码、数据与可能的论文文档,系统性地学习从问题建模、算法设计到仿真分析的完整科研过程,并重点关注其中关于需求侧资源聚合、多能互补协同与绿色低碳运行的核心理念。
内容概要:本文档名为《经济学期刊论文复现:数字化转型能促进企业的高质量发展吗》,表面上聚焦于经济学领域中数字化转型对企业高质量发展影响的研究,实则是一份涵盖多学科交叉的科研仿真代码资源合集。资源以Matlab、Simulink、Python为主要工具,系统整合了电力系统仿真、微电网优化调度、路径规划、信号处理、图像处理、机器学习预测模型等方向的可复现算法与仿真模型。尽管标题指向经济学实证分析,但内容重心在于提供顶级期刊论文的复现代码,如企业全要素生产率(TFP)测算方法(OL、FE、LP、OP、GMM)、风光储氢系统优化、需求响应与综合能源系统调度等,并融合智能优化算法与深度学习技术进行数据建模与预测分析,体现出极强的工程化与科研实用性。; 适合人群:具备一定编程基础,熟练掌握Matlab/Simulink/Python等仿真工具,从事工程仿真、经济实证研究或交叉学科科研工作的研究生、高校教师及科研人员。; 使用场景及目标:① 复现经济学顶刊论文中的计量经济模型,深入探究数字化转型对企业全要素生产率的影响机制;② 借助提供的代码资源开展电力系统故障仿真、微电网优化、多能系统调度等科研项目的算法验证与仿真分析;③ 应用机器学习与深度学习模型完成负荷预测、风电光伏出力预测、电池健康状态评估等典型实证任务; 阅读建议:此资源虽冠以经济学论文之名,实质为多领域高价值仿真代码集成,建议读者依据自身研究方向筛选适配内容,优先关注“顶刊复现”“论文复现”类项目,结合配套数据与代码进行实证推演,并通过公众号“荔枝科研社”获取完整资料与持续技术支持。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值