0%

AsyncDisplayKit 是一个 源自 Facebook 的 Paper 项目的UI 框架。它完美解决了 Paper 项目团队面临的众多核心问题之一:如何使主线程尽量清晰明了。

现在,许多 App的用户体验都严重依赖于连续的手势和物理动画。至少,你的 UI 界面可能依赖于一些滑动视图。

这种类型的用户接口大多完全取决于主线程并且对主线程阻塞异常敏感。一旦主线程阻塞就意味着动画掉帧并产生一个极差的用户体验。

主线程中要做的主要工作如下:<br>

  • 尺寸和布局:一些像 -heightForRowAtIndexPath: 或者调用 UILabel 的 -sizeThatFits方法,也包括 AutoLayout的约束求解器的指数级开销。<br>
  • 图像解码: 在一个图像框中使用 UIImage就意味着要先将图像数据解码。<br>
  • 绘图:复杂的文本也需要手动完成绘图渐变和阴影。<br>
  • 对象生存期:创建、使用、销毁系统对象(例如创建一个 UIView)。<br>

在正确使用时,AsyncDisplayKit就可以默认异步执行所有尺寸,布局和渲染操作。并且无需额外优化,App 主线程需要完成的工作量也会显著减少。

除了性能上的出色表现,新版的 AsyncDisplayKit 还提供了仅仅使用几行简单的代码就可以完成复杂功能并且方便调用的编程接口。

这篇 AsyncDisplayKit 2.0教程由两部分组成,你可以从中学到使用 ASDK完成一个易用动态应用程序的全部技能。在第一部分,你会学到构建一个 App的想法构思。在第二部分,你会学到如何创建自己的 node子类和如何使用ASDK 的强有力布局引擎。完成这段教程需要 Xcode7.3 并且需要熟悉 Objective-C。

1
2
3
4
免责声明: ASDK 和自动视图布局是不兼容的,所以在教程中将不会使用。
尽管 ASDK 完全支持 Swift,许多使用者始终使用 Objective-C
现在最流行的前100App 并没有包含任何 Swift(其中至少6个使用了 ASDK)。
因为以上原因,这个教程使用 Objctive-C
阅读全文 »

这次STMAssembleViewhttps://github.com/ming1016/STMAssembleView加入异步解析上线后发现一些线程安全方面的问题,现总结下。
先看看这段代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
- (void)viewDidLoad {

[super viewDidLoad];

self.asStr = @"string is very first";

[self performSelector:@selector(doSomething) withObject:nil afterDelay:0.5];

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{

NSLog(@"before sleep %@",self.asStr);

sleep(3);

NSLog(@"after sleep %@",self.asStr);

});

}

- (void)doSomething {

self.asStr = @"string has changed";

}

阅读全文 »

相机原理

感光度(ISO)

ISO也叫胶卷速度,衡量图像传感器对光的敏感程度。亮的时候需要的ISO就越小,暗的时候相反ISO就高噪点会多。

光圈

光圈用来衡量到达图像感应器的光所通过的通孔大小。iPhone6的光圈值是f/2.2,2.2就是表示镜头焦距和光圈的有效直径比例。

对焦

将离相机一定范围内物体渲染清晰,太近太远会模糊这种情况叫做失焦。

保存获取文件

关于Core Image处理RAW格式可以参考CoreImage/CIRAWFilter.h,以及WWDC上的讲座WWDC 2014 session 514 https://developer.apple.com/videos/wwdc/2014/#514

阅读全文 »

Shader着色器

Shader出现在OpenGL ES 2.0中,允许创建自己的Shader。必须同时创建两个Shader,分别是Vertex shader和Fragment shader.

Shader工具

Shader会有很多坑,不过一些工具能够帮助你跳过这些坑

Shader使用范例

Vertex shader

阅读全文 »

本文详细介绍了 iOS 中 Core Data 框架的使用方法,包括组件结构、设置堆栈、数据模型设计、CRUD 操作等内容,适合 iOS 开发者学习数据持久化技术。

阅读全文 »

1.入门

在本文章中,将介绍如何使用 Markdown 书写文档。内容实为总结并非原创。

2. 简介

Markdown 是由 John Gruber 在 Aaron Swartz 的帮助下,于 2004年创造的标记语言。使人可以用易读易用的纯文本格式语言书写,并且可以转换为 XHTML 或者 HTML。Markdown 是一种可以使用普通文本编辑器编写的标记语言,通过简单的标记语法,它可以使普通文本内容具有一定的格式。Markdown的语法简洁明了、学习容易,而且功能比纯文本更强,因此有很多人用它写博客。

一份 Markdown 文档通常会使用. md 的扩展名,你可以使用文本编辑器来打开编辑。
Github,GitBook,Reddit,Diaspora,Stack Overflow, OpenStreetMap 等许多组织机构都使用了 Markdown。甚至这篇文章也在使用 Markdown。

3.Titles

当我们开始书写一份文档时,我们通常需要问文章添加标题和副标题。
Markdown 支持两种标题书写格式,Setext 和 Atx

Setext 模式书写标题是在书写一级标题时在下方使用等号,而在二级标题时使用破折号。

阅读全文 »

#一、KVO原理
##1. KVO 简介

KVO 是 Objective-C 对观察者设计模式的一种实现。KVO 提供一种机制,指定一个被观察对象,当对象某个属性发生改变时,对象会获得通知,并做出相应处理;

在 MVC 设计架构的项目,KVO机制很适合实现 model 模型和 View 视图之间的通讯。

##2. 实现原理
KVO 的实现依赖于 Objective-C 强大的 Runtime。
当观察某对象α时,KVO 机制动态创建一个对象α当前类的子类,并为这个新的子类重写被观察属性 keyPath 的 setter 方法。setter 方法随后负责通知观察对象属性的改变状况。

##3. 深入剖析:
Apple 使用了 isa-swizzling 来实现 KVO。当观察对象α时,KVO 机制动态创建一个新的名为:NSKVONotifying_α的新类,该类继承自对象α的本类,且 KVO 为 NSKVONotifying_α重写观察属性的 setter 方法,setter 方法会负责在调用原setter 方法之前和之后,通知所有观察对象属性值的更改情况。

NSKVONotifying_α类剖析:在这个过程,被观察对象的 isa 指针从原来的α类,被 KVO 机制修改为指向系统新创建的子类 NSKVONotifying_α类,来实现当前类属性值改变的监听。

所以当我们从应用层面上看来,完全没有意识到有新的类出现,这是系统对 KVO 的底层实现过程,此时如果我们创建一个新的名为“NSKVONotifying_α”的类,就会发现系统运行到注册 KVO 的那段代码时程序就会崩溃。因为系统在注册监听的时候创建了名为 NSKVONotifying_α的中间类,并指向这个中间类。

(isa 指针的作用: 每个对象都有 isa 指针,指向该对象的类,它告诉 Runtime 系统这个对象的类是什么。所以对象注册为观察者时,isa 指针指向新子类,那么这个被观察的对象就神奇地变成新子类的对象(或实例)了。)因而在该对象上对 setter 的调用就会调用已重写的 setter,从而激活键值通知机制。

子类 setter 方法剖析:KVO 的键值观察通知依赖于 NSOjbect 的两个方法:

willChangeValueForKey:和 didChangeValueForKey:,在存取数值的前后分别调用2个方法:

被观察属性发生改变之前,willChangeValueForKey:被调用,通知系统该 keyPath 的属性值即将变更;
当改变发生后,didChangeValueForKey:被调用,通知系统该 keyPath 的属性值已经变更;
之后,observeValueForKey:ofObject:change:context:也会被调用。且重写观察属性的 setter 方法这种继承方式的注入是在运行时而不是编译时实现的。

阅读全文 »

基础

原理

视图显示前会有两个步骤,顺序是updating constraints -> laying out views -> 显示。

  • Updating constraints:从子视图到父视图,布局会在实际设置frame时使用,调用setNeedsUpdateConstraints触发操作。自定义视图的话可以重写updateConstraints增加本地约束。

  • Laying out views:布局视图是从父视图到子视图,通过setNeedsLayout触发。调用layoutIfNeeded可以强制系统立刻更新视图布局。

自定义视图自动布局的过程

Instrinsic Content Size

实现Instrinsic Content Size需要重写intrinsicContentSize返回合适的大小,有会影响尺寸改变的时候调用invalidateInstrinsicContentSize。一个方向设置Instrinsic Content Size,另一个方向尺寸返回UIViewNoIntrinsicMetric

Compression Resistance 和 Content Hugging

阅读全文 »

页面响应

页面响应采用[[检测iOS的APP性能的一些方法]]里的子线程监控主线程方式就能够检测到。

电量

三种方式可以获取电量,分别是通过Instruments的Energy Diagnostics,UIDevice和IOKit framework

Instruments的Energy Diagnostics

可以获取到iphone特定时段的电量消耗信息。具体步骤:
打开Developer选项中的Start Logging —> 断开iphone与PC连接 —> 一系列的用户操作 —> Stop Logging —> 连接iphone与PC, 将电量消耗数据导入Instruments。 

UIDevice

UIDevice提供了设备的详细信息,如systemVersion, batteryLevel等。

阅读全文 »

三种方式使得iOS程序即使在关闭或崩溃的情况下也能够在后台持续进行一些任务,比如更新程序界面快照,下载文件等。这三个方法分别是Background Fetch,Remote Notification和NSURLSession的backgroundSessionConfiguration

Background Fetch

开启

首先在info plist文件中开启UIBackgroundModes的Background fetch。或者手动编辑这个值

1
2
3
4
5
6
7
8
<key>UIBackgroundModes</key>

<array>

<string>fetch</string>

</array>

阅读全文 »