- 博客(11)
- 收藏
- 关注
原创 一个对RxSwift集成思想的借鉴:KKReactors
使用KVO的痛点视为一个iOS开发老司机,我在日常使用KVO过程中发现了KVO的一些不足:1、调用复杂,算上调用者,总共涉及到5个参数2、响应函数与调用地方分隔在不同的地方,阅读代码需要跳转3、一个观察者观察了多个对象后,回调里不好区分究竟是哪个变量发生了回调4、需要手动释放KVO,过多的调用removeObserver会导致闪退5、对于极其频繁的变量变动,我们无法屏蔽一些过于密集的KVO调用解决思路鉴于KVO以上的种种缺点,我决定封装一个类,来简化KVO的使用:下面罗列了以上5个痛点的解
2021-03-23 09:22:43
336
原创 几个非常有用的宏
单例定义宏#define SINGLETON_H +(instancetype)sharedInstance;#define SINGLETON_M \+ (instancetype)sharedInstance {\ static id instance = nil;\ static dispatch_once_t onceToken;\ dispatch_once(&onceToken, ^{instance = [[super al
2021-03-22 11:42:45
407
原创 一个可以用于多个设计模式场景中的框架:BlockSequence
项目案例分析在项目开发过程中,我们往往会遇到这样一种case:在有参数的时候不能运行代码,能运行代码的时候却没有参数。我可能说的有点绕。举个例子:假设我们需要新建一个VC(viewController)并push到navigation上,然后需要在新的VC上创建一个 尺寸为size的view,size的大小由上一个VC决定。这种情况下,我们可以在新VC的init(withViewSize)方法里创建view吗?不可以,因为这时候UI还没有创建好,那我们能在新VC的viewDidload里创建view
2021-03-21 09:11:01
687
原创 用NSSetUncaughtExceptionHandler尝试抓取零星闪退
关于零星闪退在项目开发过程中,我们偶尔会遇到这类问题,使得我们很难定位。这种bug闪退概率很低,设备连机后,app不闪退,但是app递交到QA或者用户那里去了之后,又会有零星的闪退。这类问题比较恶心。传统的做法是:接入类似友盟、bugly等第三方插件,让它们将app的闪退日志上传到他们的后台,然后我们去它们的后台查看日志。这种方法能在一定程度上帮助定位问题。但是由于这种第三方库上传日志有延迟,而且查看日志并非事故发生第一现场,导致我们定位bug效率偏低。我们的解决办法而我们组的做法是:在非上架的包里使
2021-03-18 15:43:26
600
原创 一个对dispatch_group的改进:TaskHarmonizer
dispatch_groupdispatch_group是GCD中给我们提供的一个非常好用的功能,它的主要用途是协同任务。即保证某个任务一定在其他任务完成之后才进行。典型的使用案例是:进入页面后,我们需要等待三个网络请求,等三个界面都返回后在主线程刷新界面(下面简称案例)dispatch_group实现以上案例的逻辑。dispatch_group实现案例的时候主要涉及到4个接口,简单介绍如下:dispatch_group_create 创建一个dispatch_group_t对象void dis
2021-03-15 13:56:34
408
原创 一个简单而严谨的单例创建方法
关于单例单例模式是一种古老而常用的设计模式,相信大家都已经能熟练编写单例代码,我在这里不再赘述单例的实现。大部分情况下,我们的单例都是主线程使用,所以这里暂时不考虑线程同步问题。不考虑同步问题的情况下,单例一般的书写方式如下:+ (instancetype)sharedInstance { static id instance = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{in
2021-03-13 17:09:47
180
原创 关于SDWebImage的几个缺陷的改进
关于SDWebImage众所周知,SDWebImage是一款众所周知的第三方插件,它实现了控件上的图片的远程加载。非常的好用。它还采用了双极缓存————内存、磁盘存储,保证了重复图片有较高的概率避免下载,可以说是用空间换速度的一个典型的范例。它的这种设计模式,有点像我们大学里《微机原理》上讲过的CPU的二级缓存,用硬件提高CPU的访问命中率,从而提高CPU访问内存的效率SDWebImage众多的参数,保证了它的使用非常灵活。它接受的参数有:urlstateplaceholderoption
2021-03-11 19:33:51
417
原创 如何优雅地给目标变量设置额外的变量
分类为啥不能添加成员变量?先看Category的底层结构struct _category_t {const char *name;struct _class_t *cls;const struct _method_list_t *instance_methods; // 对象方法列表const struct _method_list_t *class_methods; // 类方法列表const struct _protocol_list_t *protocols; // 协议列表co
2021-03-06 15:29:14
198
原创 一个简单的适配器模式的运用——如何在Array中加入不同类型的对象
前言:swift中的枚举比OC功能强大多了,给我感触最深的是,swift中的枚举居然还可以带参数。于是我联想到了用带参数的枚举可以解决我们OC项目中的一些问题。Swift 中如何在数组中装不同类型的元素开发过程中,可能会遇到这种情况:希望往数组中存一些数据,这些数据可能有相同的一些特征点,但不是一个类型,甚至没有共同特征,只是想对它做统一处理逻辑,但数组又不能存不同类型的数据,这种情况怎么实现我们的需求呢?先说第一类,有共同特征:第一想法是定一个协议,把数据归为一类,就能存进去了,但这样有点不方便,
2021-03-04 11:16:32
229
1
原创 全局秒定时器
@全局秒定时器全局秒定时器你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。全局秒定时器我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客:全新的界面设计 ,将会带来全新的写作体验;在创作中心设置你喜爱的代码高亮样式,Markdown 将代码片显示选择的高亮样式 进行展示;增加了 图
2021-03-01 10:07:27
242
原创 一个简单的OC里的Tuple的实现
背景介绍:swift提供了一个简单易用的数据组合,元组,英文名叫做tuple。元组内的值可以是任意类型,并不要求是相同类型。一些非常简单的struct的可以用tuple来代替。tuple的访问可以采用通过名字来获取这些元素的值,也可以通过索引来访问元素的值。非常的灵活、方便。可惜OC里面不提供这样的语法。在参考了swift语法了,我在这里用数组的方式简单地在OC里实现了一下tuple实现原理:1、我用数组作为容器,我将各个值当做数组元素,存入这个数组。访问的时候通过下标就可以访问。2、那么问题来
2021-02-25 19:57:36
453
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人