SDWebImage探究(七) —— 深入研究图片下载流程(一)之有关option的位移枚举的说明

版本记录

版本号 时间
V1.0 2018.02.10

前言

我们做APP,文字和图片是绝对不可缺少的元素,特别是图片一般存储在图床里面,一般公司可以委托第三方保存,NB的公司也可以自己存储图片,ios有很多图片加载的第三方框架,其中最优秀的莫过于SDWebImage,它几乎可以满足你所有的需求,用了好几年这个框架,今天想总结一下。感兴趣的可以看其他几篇。
1. SDWebImage探究(一)
2. SDWebImage探究(二)
3. SDWebImage探究(三)
4. SDWebImage探究(四)
5. SDWebImage探究(五)
6. SDWebImage探究(六) —— 图片类型判断深入研究

一般枚举

大家都用过枚举,一般的枚举,比如下面这种:

typedef NS_ENUM(NSInteger, UIViewContentMode) {
    UIViewContentModeScaleToFill,
    UIViewContentModeScaleAspectFit,      // contents scaled to fit with fixed aspect. remainder is transparent
    UIViewContentModeScaleAspectFill,     // contents scaled to fill with fixed aspect. some portion of content may be clipped.
    UIViewContentModeRedraw,              // redraw on bounds change (calls -setNeedsDisplay)
    UIViewContentModeCenter,              // contents remain same size. positioned adjusted.
    UIViewContentModeTop,
    UIViewContentModeBottom,
    UIViewContentModeLeft,
    UIViewContentModeRight,
    UIViewContentModeTopLeft,
    UIViewContentModeTopRight,
    UIViewContentModeBottomLeft,
    UIViewContentModeBottomRight,
};

这个填充模式的枚举,每次使用的时候我们都只能使用其中的一个元素,比如使用UIViewContentModeScaleToFill,而且在定义枚举值的时候我们可以指定从一个整数值开始,后面的值依次比前一个值加1;如果不指定值,那么第一个成员的值默认为0,后面的值还是依次递增为1, 2......,这个使用起来很简单了,也不用多说。


位移枚举

这个与上面的一般枚举的区别就在于,使用的时候可以使用多个值,比如苹果原生的API中很多这种位移枚举:

typedef NS_OPTIONS(NSUInteger, UIViewAnimationOptions) {
    UIViewAnimationOptionLayoutSubviews            = 1 <<  0,
    UIViewAnimationOptionAllowUserInteraction      = 1 <<  1, // turn on user interaction while animating
    UIViewAnimationOptionBeginFromCurrentState     = 1 <<  2, // start all views from current value, not initial value
    UIViewAnimationOptionRepeat                    = 1 <<  3, // repeat animation indefinitely
    UIViewAnimationOptionAutoreverse               = 1 <<  4, // if repeat, run animation back and forth
    UIViewAnimationOptionOverrideInheritedDuration = 1 <<  5, // ignore nested duration
    UIViewAnimationOptionOverrideInheritedCurve    = 1 <<  6, // ignore nested curve
    UIViewAnimationOptionAllowAnimatedContent      = 1 <<  7, // animate contents (applies to transitions only)
    UIViewAnimationOptionShowHideTransitionViews   = 1 <<  8, // flip to/from hidden state instead of adding/removing
    UIViewAnimationOptionOverrideInheritedOptions  = 1 <<  9, // do not inherit any options or animation type
    
    UIViewAnimationOptionCurveEaseInOut            = 0 << 16, // default
    UIViewAnimationOptionCurveEaseIn               = 1 << 16,
    UIViewAnimationOptionCurveEaseOut              = 2 << 16,
    UIViewAnimationOptionCurveLinear               = 3 << 16,
    
    UIViewAnimationOptionTransitionNone            = 0 << 20, // default
    UIViewAnimationOptionTransitionFlipFromLeft    = 1 << 20,
    UIViewAnimationOptionTransitionFlipFromRight   = 2 << 20,
    UIViewAnimationOptionTransitionCurlUp          = 3 << 20,
    UIViewAnimationOptionTransitionCurlDown        = 4 << 20,
    UIViewAnimationOptionTransitionCrossDissolve   = 5 << 20,
    UIViewAnimationOptionTransitionFlipFromTop     = 6 << 20,
    UIViewAnimationOptionTransitionFlipFromBottom  = 7 << 20,

    UIViewAnimationOptionPreferredFramesPerSecondDefault     = 0 << 24,
    UIViewAnimationOptionPreferredFramesPerSecond60          = 3 << 24,
    UIViewAnimationOptionPreferredFramesPerSecond30          = 7 << 24,
    
} NS_ENUM_AVAILABLE_IOS(4_0);

这种枚举我们就可以一次选择多个值,比如说我们可以使用UIViewAnimationOptionLayoutSubviews | UIViewAnimationOptionAllowUserInteraction,这么写我们就是使用该枚举的前两个成员。这样写的作用就是既可以布局子视图,还可以允许用户交互。

但是位移枚举的原理是怎样的呢?

其实给一个枚举变量赋予多个枚举值的时候,原理只是把各个枚举值加起来罢了。当加起来以后,就获取了一个新的值,那么为了保证这个值的唯一性,这个时候就体现了位运算的重要作用。位运算可以确保枚举值组合的唯一性。其实|这个按位或的符号就是将多个枚举值加起来的意思。

下面基于SDWebImage一个options的按位枚举和大家说一下该枚举值的使用方法,先看一下代码。

#import "ViewController.h"

typedef NS_OPTIONS(NSUInteger, SDWebImageOptions) {
    SDWebImageRetryFailed = 1 << 0,
    SDWebImageLowPriority = 1 << 1,
    SDWebImageCacheMemoryOnly = 1 << 2,
    SDWebImageProgressiveDownload = 1 << 3,
    SDWebImageRefreshCached = 1 << 4,
    SDWebImageContinueInBackground = 1 << 5,
    SDWebImageHandleCookies = 1 << 6,
    SDWebImageAllowInvalidSSLCertificates = 1 << 7,
    SDWebImageHighPriority = 1 << 8,
    SDWebImageDelayPlaceholder = 1 << 9,
    SDWebImageTransformAnimatedImage = 1 << 10,
    SDWebImageAvoidAutoSetImage = 1 << 11,
    SDWebImageScaleDownLargeImages = 1 << 12
};


@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    NSLog(@"SDWebImageRetryFailed = %ld", SDWebImageRetryFailed);
    NSLog(@"SDWebImageLowPriority = %ld", SDWebImageLowPriority);
    NSLog(@"SDWebImageCacheMemoryOnly = %ld", SDWebImageCacheMemoryOnly);
    NSLog(@"SDWebImageProgressiveDownload = %ld", SDWebImageProgressiveDownload);
    NSLog(@"SDWebImageRefreshCached = %ld", SDWebImageRefreshCached);
    NSLog(@"SDWebImageContinueInBackground = %ld", SDWebImageContinueInBackground);
    NSLog(@"SDWebImageDelayPlaceholder = %ld", SDWebImageDelayPlaceholder);
    NSLog(@"SDWebImageScaleDownLargeImages = %ld", SDWebImageScaleDownLargeImages);
    
    SDWebImageOptions option1 = SDWebImageDelayPlaceholder;
    SDWebImageOptions option2 = SDWebImageContinueInBackground;
    
    NSLog(@"--------  & --------");
    
    NSLog(@"%ld", option1 & option2);
    NSLog(@"%ld", option1 & option1);
    
    NSLog(@"--------  | --------");
    
    NSLog(@"%ld", option1 | option2);
    NSLog(@"%ld", option1 | option1);
}

@end

重要的就是看输出

2018-02-11 10:21:39.294440+0800 JJWebImage[4506:1119756] SDWebImageRetryFailed = 1
2018-02-11 10:21:39.294518+0800 JJWebImage[4506:1119756] SDWebImageLowPriority = 2
2018-02-11 10:21:39.294543+0800 JJWebImage[4506:1119756] SDWebImageCacheMemoryOnly = 4
2018-02-11 10:21:39.294564+0800 JJWebImage[4506:1119756] SDWebImageProgressiveDownload = 8
2018-02-11 10:21:39.294585+0800 JJWebImage[4506:1119756] SDWebImageRefreshCached = 16
2018-02-11 10:21:39.294657+0800 JJWebImage[4506:1119756] SDWebImageContinueInBackground = 32
2018-02-11 10:21:39.294684+0800 JJWebImage[4506:1119756] SDWebImageDelayPlaceholder = 512
2018-02-11 10:21:39.294707+0800 JJWebImage[4506:1119756] SDWebImageScaleDownLargeImages = 4096
2018-02-11 10:21:39.294728+0800 JJWebImage[4506:1119756] --------  & --------
2018-02-11 10:21:39.294773+0800 JJWebImage[4506:1119756] 0
2018-02-11 10:21:39.294796+0800 JJWebImage[4506:1119756] 512
2018-02-11 10:21:39.294815+0800 JJWebImage[4506:1119756] --------  | --------
2018-02-11 10:21:39.294833+0800 JJWebImage[4506:1119756] 544
2018-02-11 10:21:39.299656+0800 JJWebImage[4506:1119756] 512

这里可以看到:

  • 两个不同的枚举值按位与&其实就是0,相同的按位&就是其本身。
  • 两个不同的枚举值按位或|其实就是两个枚举值的相加,相同的按位或|就是其本身。

这个就是按位枚举的基本定义,希望能帮助到不怎么使用和探究原理的小伙伴。

后记

本篇已结束,后面更精彩~~~

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,716评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,558评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,431评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,127评论 0 209
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,511评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,692评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,915评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,664评论 0 202
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,412评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,616评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,105评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,424评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,098评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,096评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,869评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,748评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,641评论 2 271

推荐阅读更多精彩内容