0%

1.Dispatch Group

在追加到 Dispatch Queue 中的多个任务处理完毕之后想执行结束处理,这种需求会经常出现。如果只是使用一个 Serial Dispatch Queue (串行队列)时,只想要将执行的处理全部追加到改串行队列中并在最后追加结束处理即可,但是在使用 Concurrent Queue 时,可能会同时使用多个 Dispatch Queue 时,源码就会变得很复杂。

这种情况下,就可以使用 Dispatch Group。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
dispatch_group_t group = dispatch_group_create();
dispatch_queue_t queue = dispatch_queue_create("com.wangwang.www", DISPATCH_QUEUE_CONCURRENT);

dispatch_group_async(group, queue, ^{
for (int i = 0; i < 1000; i++) {
if (i == 999) {
NSLog(@"11111");
}
}
});

dispatch_group_async(group, queue, ^{
NSLog(@"22222222");
});

dispatch_group_async(group, queue, ^{
NSLog(@"3333");
});

dispatch_group_notify(group, queue, ^{
NSLog(@"done");
});
阅读全文 »

Core Image API架构

Core Image的插件架构允许编写自定义滤镜与系统滤镜集成来扩展功能。Core Image需要context对象来实现。

找可用滤镜

向Core Image的kCICategoryBuiltIn类请求得到滤镜名。或者使用Quartz Composer里的Filter查看并且进行组合查看效果。这个范例也可以查看https://github.com/objcio/issue-21-core-image-explorer
官方提供的Core Image滤镜的完整列表https://developer.apple.com/library/ios/documentation/GraphicsImaging/Reference/CoreImageFilterReference/index.html#//apple_ref/doc/uid/TP40004346

1
2
3

let filterNames = CIFilter.filterNamesInCategory(kCICategoryBuiltIn) as [String] //目前OS X有169个内置滤镜,iOS上有127个

创建滤镜

1
let blurFilter = CIFilter(named:"CIGaussianBlur”) //根据滤镜列表里的滤镜名,      可以创建一个滤镜对象,比如高斯模糊滤镜
阅读全文 »

基本动画

  • 使用 CABasicAnimation,实现一个动画
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
CABasicAnimation *animation = [CABasicAnimation animation];

animation.keyPath = @"position.x";

animation.fromValue = @77;

animation.toValue = @455;

animation.duration = 1;

//使rocket留在最终状态,设置removedOnCompletion为No以防止它被自动移除

animation.fillMode = kCAFillModeForward;

animation.removedOnCompletion = NO;

[rocket.layer addAnimation:animation forKey:@"basic"];
阅读全文 »

相关组件

  • NSURLSession
  • NSURLSessionConfiguration
  • NSURLSessionDataTask
  • NSURLSessionUploadTask
  • NSURLSessionDownloadTask

与NSURLConnection对比

改进是可以配置每个session的缓存,协议,cookie以及credential policy。每个NSURLSession对象都是一个NSURLSessionConfiguration对象来进行初始化,指定那些策略和增强移动设备上性能选项。

NSURLSessionTask

负责处理数据的加载以及文件和数据在客户端与服务器之间的上传和下载。3个子类NSURLSessionDataTask,NSURLSessionUploadTask,NSURLSessionDownloadTask可以直接使用。这三个子类完成最基本的网络任务,获取JSON或XML数据,上传和下载文件。

所有task都是可以取消,暂停或恢复的。当download task取消时,可以通过选项创建一个resume data传递给下一次新创建的download task继续download

Get请求

阅读全文 »

Core ML 是一个使各种机器学习和统计模型在 macOS 和 iOS 上原生支持的令人兴奋的新框架。它帮助开发者将已经成型的统计和机器学习模型整合到应用之中。这个模块是基于苹果公司的底层机器学习基本元件,有一些是在 WWDC2016中声明的。
#Core ML在三个方面帮助开发者:

  1. Core ML 支持多种机器学习模型,从类神经网络模型到广义线性模型,Core ML 中都有。
  2. Core ML 使添加机器学习模型到开发者应用中更容易。这个目标是通过 coremltools实现的,Core ML Tools 是一个 专门帮助生成 Xcode 可用的 .mlmodel 文件的 Python 包。
  3. Core ML 可以自动为开发者的模型提供自定义编程接口来提供可供调用的 API。这项特性帮助开发者在 Xcode 中直接使用模型,就像模型是一个本地类型。

在阅读以上内容之后,我们也就可以得到一个关于 Core ML 声明周期的基本认识。开发者可以用 Python创建一个模型,生成一个 .mlmodel 文件,添加该模型到 Xcode 中并且通过 Core ML 在一个设备上使用该模型。现在咱们开始吧!

阅读全文 »

先前写到的一篇Masonry心得文章里已经提到了很多AutoLayout相关的知识,这篇我会更加详细的对其知识要点进行分析和整理。

来历

一般大家都会认为Auto Layout这个东西是苹果自己搞出来的,其实不然,早在1997年Alan Borning, Kim Marriott, Peter Stuckey等人就发布了《Solving Linear Arithmetic Constraints for User Interface Applications》论文(论文地址:http://constraints.cs.washington.edu/solvers/uist97.html)提出了在解决布局问题的Cassowary constraint-solving算法实现,并且将代码发布在他们搭建的Cassowary网站上http://constraints.cs.washington.edu/cassowary/。后来更多开发者用各种语言来写Cassowary,比如说pybee用python写的https://github.com/pybee/cassowary。自从它发布以来JavaScript,.NET,JAVA,Smalltall和C++都有相应的库。2011年苹果将这个算法运用到了自家的布局引擎中,美其名曰Auto Layout。

Cassowary

Cassowary是个解析工具包,能够有效解析线性等式系统和线性不等式系统,用户的界面中总是会出现不等关系和相等关系,Cassowary开发了一种规则系统可以通过约束来描述视图间关系。约束就是规则,能够表示出一个视图相对于另一个视图的位置。

Auto Layout的生命周期

进入下面主题前可以先介绍下加入Auto Layout的生命周期。在得到自己的layout之前Layout Engine会将Views,约束,Priorities(优先级),instrinsicContentSize(主要是UILabel,UIImageView等)通过计算转换成最终的效果。在Layout Engine里会有约束变化到Deferred Layout Pass再到应用Run Loop再回到约束变化这样的循环机制。

约束变化

触发约束变化包括

  • Activating或Deactivating
  • 设置constant或priority
  • 添加和删除视图
阅读全文 »

1.简介

Swift 使用自动引用计数(ARC)机制来跟踪和管理内存。ARC 会在类的实例不再被使用时,自动释放其占用的内存。文章将介绍:

  • 自动引用计数的工作机制
  • 自动引用计数实践
  • 类实例之间的循环强引用
  • 解决实例之间的循环强引用
  • 闭包引起的循环强引用
  • 解决闭包引起的循环强引用

Tips: 引用计数仅仅应用于类的实例。结构体和枚举类型是值类型,不是引用类型,也不是通过引用的方式存储和传递。

2.自动引用计数的工作机制

当每次创建一个类的新的实例的时候,ARC 会分配一块内存来存储该实例信息。内存中会包含实例的类型信息,以及这个实例所有相关的存储型属性的值。

阅读全文 »

1.简介

析构器 只适用于类类型,当一个类的实例被释放之前,析构器会被立即调用。析构器用关键字 deinit 来标示,类似于构造器要用 init 来标示。
本文章将主要介绍 析构过程原理 以及 析构器的相关实践。

2.析构过程原理

Swift 会自动释放不在需要的实例以释放资源。并且通过自动引用计数(ARC)处理实例的内存管理。但是,当使用自己的资源时,可能需要进行一些额外的清理。例如,在创建了一个自定义的类打开一个文件,并写入一些数据,你可能需要在类实例被释放之前动手关闭文件。

在类的定义中,每个类最多只有一个析构器,而且析构器不带有任何参数,例如:

1
2
3
deinit{
//执行析构过程
}
阅读全文 »

线程

使用Instruments的CPU strategy view查看代码如何在多核CPU中执行。创建线程可以使用POSIX 线程API,或者NSThread(封装POSIX 线程API)。下面是并发4个线程在一百万个数字中找最小值和最大值的pthread例子:

阅读全文 »