求人不若求己——用Swift访问iOS系统通讯录

之所以起这么个题目——求人不若求己,实在是有感而发。不管是论坛、问答网站、QQ群,还是各路视频教程,“怎么用Swift访问系统通讯录”这个问题,我问了n遍,n遍石沉大海……

后来在国外的网站上终于找到了几个关键地方相关的问题,才终于突破了这个现在看来不怎么算得上瓶颈的问题。

其实也难怪,现在大部分用Swift的程序员,原本就很熟悉iOS开发,从OC迁移到Swift只是语法和语言特性上的变化。而对于我这样的菜鸟,连框架怎么引入都不会……虽然有热心老鸟的指点,但是依然快要疯掉了。

尝试一天,试了三种方法:直接桥接现成的类库;写一个简单的OC类库,不同在于不用OC解析数据,而在相对熟悉的Swift种进一步解析;以及最后用Swift重写所有语句,打包成方法,直接调用。

最终写完的SwiftContactTool:

输出示例:

_$!<Home>!$_Phone: 555-610-6679
FirstName: David
FirstNamePhonetic:
_$!<Home>!$_Address_Contrycode: us
Department:
_$!<Home>!$_Address_City: Tiburon
_$!<Home>!$_Address_State: CA
_$!<Home>!$_Address_Country: USA
Note: Plays on Cole’s Little League Baseball Team

twitter_SNS_URL: http://twitter.com/aaaaa
LirstNamePhonetic:
Organization:
Nikename:
_$!<Home>!$_Address_Street: 1747 Steuart Street
LastName: Taylor
JobTitle:
twitter_SNS_Serves: twitter
twitter_SNS_Username: aaaaa
_$!<HomePage>!$_URL: www.net.com
_$!<Anniversary>!$_Date: 2011-12-05 12:00:00 +0000
———

PS. 无论用哪种方法,在Swift下,ViewDidLoad函数中请求通讯录访问权限时,对话框总是被遮挡在加载界面之后,进程如果等待请求结果,应用就会卡在加载界面上;而要是不设置等待,首次启动就跳过了加载通讯录内容的过程…… 暂时,这大概会一直是个无解的问题咯……

【转】并发、并行,以及iOS中dispatch_semaphore的应用

并发:同一个时间内运行多个任务。又叫共行性,是指处理多个同时性活动的能力。
并行:是指两个并发的任务同时发生。

并发不一定并行,并发不一定要同时发生。

举个例子:

有两个快递分别要送到目的地,有以下两种方案:

(1)一个快递员分别把两个快递送到对应的目的地。(并发)

(2)两个快递员同时送一个快递到目的地。(并行)

在iOS中,经常可以看见有这样的需求,就是一个方法要等另外一个方法执行完毕再做相对应的处理,比如说一些网络请求,需要根据上一个请求的返回值做相对应的处理再执行第二个请求,所以我们不能让两个请求同时去请求网络。

dispatch_semaphore(GDC)

信号量是一个整型值并且具有初始计数值,信号量通常支持两个操作:通知和等待。当信号被通知的时候计数值会增加,当信号量在线程上等待的时候,必要的情况下线程会被阻塞掉,直至信号被通知时计数值大于0,然后线程会减少这个计数继续工作。
GCD中又3个信号量有关的操作:

dispatch_semaphore_create     信号量创建

dispatch_semaphore_signal      发送通知

dispatch_semaphore_wait         信号量等待