关于如何将私人Pod库发布到pod库的心得
引子周末闲来无事,琢磨了下如何将git上的代码做成一个开源的库,然后供自己和别人在开发中使用。捣鼓了一个多小时终于是成功了,大家可以在命令行下输入,pod search CYKit ,就会搜索到我这个小demo了。
准备工作
github准备开源的工程地址,并且有Release的Tag。如我自己的开源地址为:https://github.com/TripleFireMan/CYKit.git,Tag为0.1.
注册一个pod trunk 的账号,用来将自己的库push到cocoaPod的master spec中,这样才会能被别人搜索到。注册方式为 命令行输入 pod trunk register ab36474XXX@126.com ‘your user name’ –description=’device name or something other’
正文
在工程目录下创建Podspec文件,cd 到 ...
SDWebImage学习笔记(三)
上一小节研究了SDWebImageView里面的缓存实现原理,在这一小节我们继续研究SDWebImage对缓存和下载整体功能的封装。也就是-SDWebImageManager管理类。
组装SDWebImageManager使用了组装的设计模式,通过内部包含SDWebImageCache和SDWebImageDownloader的成员变量来实现下载和缓存的功能。
123@interface SDWebImageManager : NSObject@property (strong, nonatomic, readonly, nullable) SDImageCache *imageCache;@property (strong, nonatomic, readonly, nullable) SDWebImageDownloader *imageDownloader;
接入,下载和缓存对象可以由初始化的时候外部传入,但是官方建议的还是在SDWebImageManager初始化的时候进行初始化。
123456789101112131415161718192021222324+ (nonn ...
SDWebImage学习笔记(二)
缓存这一小节主要研究下SDWebImage的cache功能是如何实现的,首先找到在SDWebImage中充当缓存功能的类,这一步很简单,直接定位到SDImageCache类。也就是说,接下来主要就研究这个类了。
SDImageCacheConfig 缓存配置SDWebImage提供了一个专门的类SDImageCacheConfig,来进行Cache的一些配置工作,主要配置的信息包括以下几点
是否允许解压原图
是否支持iCloud,默认不支持
是否允许将图片缓存到内存,默认支持
最大缓存周期(默认是一周)
最大缓存大小(默认不设置)
SDImageCache 缓存类SDImageCache是一个单例,作为执行图片缓存的工具类,整个App只需要有一个全局的实例就可以了,这没毛病。
SDImageCache文件系统在开始缓存操作之前,除了配置项需要配置外,我个人感觉还有一个地方需要提前准备好的就是缓存的文件系统。
默认的文件存储路径SDImageCache的默认文件存储路径是由单例去控制的,在单例初始化的时候,传入了默认的文件夹名称default,这样的话,默认的文件路径就是../ca ...
SDWebImage学习笔记(一)
简介SDWebImage是ios开发中,最常见的图片加载框架,它主要实现了图片异步加载、图片缓存,并提供了UIImageView、UIButton、MKAnnotationview的类目,使用体验很友好,也很方便,成为广大ios开发者加载网络图片的选择,今天我主要是来通过分析其源码来研究下,SDWebimage到底是如何进行设计的,架构的?
特性
提供UIimageview、UIbutton、MKAnnotationview的类目加载网络图片及缓存管理
异步的图片下载
异步的图片内存+磁盘图片缓存,并支持自动的缓存过期处理
图片的后台解压
确保同一个url不会下载多次(是优点也是缺点)
错误的url不会不停的下载
永远不会阻塞主线程
性能提升
采用GCD和ARC
支持的图片格式
支持JPEG,PNG,GIF
支持WEBP
使用要求
ios 7.0 +
tvos 9.0 +
watchos 2.0 +
osx 10.8 +
xcode 7.3 +
常见问题
如果UITableViewCell使用了动态的图片大小,图片展示可能会有问题,也就是说SDWebImage是根据pl ...
如何使用subline-text2-作为markdown的编辑工具
今年8月份的时候,在二代的带领下,接触了Hexo+Github搭建个人的博客空间的新姿势,在此基础上。我个人选择了sublinetext2 作为markdown的编辑工具,实测还可以,采用subline能够做到
在线预览 (通过安装OmniMarkupPreviewer实现)
语法高亮 (通过安装MarkdownEditing实现)
单纯的subline虽然也可以打开markdown文件,也可以编辑,但是效果和体验总是不太好,我今天介绍的这俩个插件能够大大提高书写效率和提升书写体验。先附俩张图体验一下最终的效果。
基本可以实现,在写的过程中就可以看到最终显示在网页上是什么效果。不用等写完之后再去调整展示的界面,还是挺方便的。
这里有几个点需要注意一下。
将OmniMarkupPreviewer,MarkdownEditing从github上clone到subline的packages下需要重启下subline。
如果是代码的话,高亮需要使```将代码包起来 ,形如```objc 这里添写需要写的代码```
在线预览功能,可以通过在subline右键点击preview m ...
译 ios并发编程指南
并发编程指南
并发1 概述1.1 并发的概念并发其实指的是多项任务在同一时间进行,随着多核CPU的普及以及发现任务只在某一核上不停的增加,软件开发者需要一种方式充分的利用多核系统。虽然诸如IOS、MacOS兼容多项程序同时执行,但是大多数的程序运行在后台,并且执行任务只需要很短的CPU时间。这是因为前台应用同时获取了用户的关注并且是设备处于忙的状态。如果一个程序有很多的任务需要处理,但是又只获得了很少的碎片CPU时间,那些额外的处理资源将被浪费。 在过去,在应用中引入并发要求创建一个或者多个额外的线程,遗憾的是,编写线程代码是一项非常有挑战性的事情,线程是一种‘低级’的工具,并且需要手动去管理,获取多少个线程是最优的,动态取决于当前的系统以及底层硬件的支持。实现一个完美的线程解决方案,变的极其困难或者说不可能实现。另外,采取添加线程的方式实现同步的机制,不仅给软件开发带来了复杂性和风险性,而且也并不能确保提升性能。 OSX和iOS采取了一种比传统的基于线程的系统和程序,更加异步的方式去执行并发任务。并不是直接去创建线程,应用需要做的是定义一些特殊的任务,然后让系统去执行它们,让操 ...
点点滴滴:HTTPS和HTTP的区别
从iOS9开始,苹果官方开始要求,上线的APP需要对HTTPs协议进行支持,虽然我们可以通过在项目的plist文件中设置属性的方式,暂时绕开这条限制, 但是我个人认为还是有必要了解下,苹果为什么要这么做?
先简单科普下HTTP与HTTPS分别代表什么,以及它们的区别到底是什么?
HTPPS和HTTP的概念HTTPS(全称:Hypertext Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单讲是HTTP的安全版。即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。 它是一个URI scheme(抽象标识符体系),句法类同http:体系。用于安全的HTTP数据传输。https:URL表明它使用了HTTP,但HTTPS存在不同于HTTP的默认端口及一个加密/身份验证层(在HTTP与TCP之间)。这个系统的最初研发由网景公司进行,提供了身份验证与加密通讯方法,现在它被广泛用于万维网上安全敏感的通讯,例如交易支付方面。
超文本传输协议 (HTTP-Hypertext transfer ...
点点滴滴:一个容易被忽视的数组和字典的方法
今天来讨论下平时大家熟悉的数组/字典,但是容易忽略的数组/字典的valueForKeyPath方法可能大家对- (id)valueForKeyPath:(NSString *)keyPath方法不是很了解。其实这个方法非常的强大,举个例子:
12NSArray *array = @[@"name", @"w", @"aa", @"jimsa"];NSLog(@"%@", [array valueForKeyPath:@"uppercaseString"]);
输出( NAME, W, AA, JIMSA)
相当于数组中的每个成员执行了uppercaseString方法,然后把返回的对象组成一个新数组返回。既然可以用uppercaseString方法,那么NSString的其他方法也可以,比如
1[array valueForKeyPath:@"length"];
返回每个字符串长度的组成的数组。只要你能想到的成员实例方法 ...
点点滴滴:NSLog一点说道
今天的小结主要讲述在IOS开发中实现自定义的NSLog方法
1 为什么要对NSLog进行重定义?在开始这个知识点的讲解之前,首先说下,为什么要对NSLog宏进行重定义。在项目开发中,经常需要对程序进行调试。由于调试分布在项目的各种地方,当项目发布时,如果再将调试信息去掉,显示会消耗很大的人力,物力。幸好,强大的xcode给我们提供了一个非常方便的功能。在项目的Build Settings中给Apple LLVM Preprocessing中的 preprocessor macros下面的Debug添加一个调试宏DEBUG=1,记住在Release下面不要添加任何东西!添加这个东西的意思就是告诉编译器,在调试阶段,项目中进行了一个DEBUG的宏定义,但是Release阶段不定义。
2 如何对NSLog宏进行定义了12345#ifdef DEBUG#define NSLog(args...) ExtendNSLog(__FILE__,__LINE__,__PRETTY_FUNCTION__,args);#else#define NSLog(x...)#endif
下面来对上述宏进行解 ...
点点滴滴:关于va_list
想必在iOS这行混过一段时间的人看到下面的代码都会很熟悉
我们今天要讨论的就是这个方法最后边的可变参数列表的使用。这个方法内部到底是如何实现的呢?以及这样提供函数调用的好处又有哪些呢?接下来,我们慢慢研究下
1.首先,苹果这么做,肯定是有它这么设计的原因。相比于最后一个参数换为数组,可变参数列表的形式更加直观,可读性强!此外,相对于只能传递一个参数的方法,可变参数列表参数又提供了扩展性,基于此,很有必要去研究下可变参数列表的使用了。2.其次,iOS实现可变参数列表的关键点是什么?关键在于va_list。va_list是C语言提供的处理可变参数的一种方法。具体的注意事项如下
1.首先在函数里面定义va_list的变量,这个变量是指向参数的指针。2.然后用va_start初始化刚定义的va_list变量。3.然后用va_arg返回可变的参数,va_arg的第二个参数是返回的参数类型,例如va_arg(args,NSString *),va_arg每调用一次就会指向下个参数的地址,直到再也没有获取到参数为止。4.最后用va_end宏结束可变参数的获取。
下面,用一个demo来具体演示下如果 ...