iOS 并发编程之 Thread

在 iOS 并发编程之 Operation 中,我们说过 GCD 是将线程管理的代码从应用层移到了系统层,它是基于线程技术的。虽然在 iOS 和 OS X 平台不鼓励直接使用线程实现并发,但它还是有它的应用场景。那么什么时候应该使用线程呢?

当我们的代码需要实时运行时用线程实现是一个好方法。虽然分发队列会尽可能快的执行你的任务,但是它们不能解决实时约束。如果你想让运行在后台的代码给你更可预期的行为,线程是一个更好的选择。

既然线程仍然有它的应用场景,我们还是有必要掌握它。

Thread是什么

线程是一种在应用中实现多条运行路径相对轻量的方法。在系统层,程序并排运行,系统根据程序的需要为每个程序分配执行时间。但是在每个程序内部存在一个或多个线程运行,它们可以被用来以同时或接近同时的方式执行不同的任务。系统本身实际上管理这些线程的运行,调度它们运行在可用的核上,根据需要中断它们以允许其他线程运行。

从技术角度看, 线程是管理代码执行所需的内核级和应用程序级数据结构的组合。内核级结构将事件分派到线程, 并在一个可用内核上协调线程的抢先调度。应用程序级结构包括用于存储函数调用的调用堆栈和需要管理、操作线程的属性和状态的应用程序结构。

在非并发应用中只有一个运行线程。它随应用的主程序开始和结束,一个一个地调用不同的方法或函数实现应用的行为。与此相反,支持并发的应用以一个线程开始,根据需要添加创建附加执行路径。每个新路径有它自定义的开始程序,它和应用的主程序是独立运行的。拥有多线程的应用提供两个重要的潜在优势:

  • 多线程可以改善应用的响应性
  • 多线程在多核系统上可以改善应用的实时性

如果你的应用只有一个线程,那么它需要做所有的事情。它必须响应事件,更新你应用的窗口和执行实现你应用行为需要的所有计算。单线程的问题在于它一次只能做一件事。当你的某个计算需要花费很长时间完成会发生什么呢?当你的代码忙于计算它需要的值,你的应用停止响应用户的事件和更新窗口。如果这种行为持续足够长的时间,用户也许认为你的应用已经挂起,于是尝试强制退出。但是,如果将自定义计算移到单独的线程上,则应用程序的主线程可以自由地响应用户交互。

在多核计算机如此普遍的今天,线程为某些类型的应用提供了一种提高性能的方法。线程可以在处理器不同的核上同时执行不同的任务,让应用在指定时间增加它工作数量成为了一种可能。

当然,线程并不是解决应用性能问题的万用药。提供好处的同时它也带来各种潜在问题。在应用内拥有多个可执行路径会增加你代码的复杂度。每个线程需要协调它和其他线程的行为以防止损坏应用的状态信息。因为单个应用的线程共享相同的内存空间,它们访问所有相同的数据结构。如果两个线程同时尝试操作相同的数据,一个线程可能覆盖另一个线程的修改,最终导致数据被损坏。即使在这里有了正确防护,你还是要当心编译器优化会在你的代码中引入隐蔽的问题。

继续阅读

iOS App 开发问题汇总(二)

1.Ad Hoc分发应用

导出Ad Hoc授权应用 Xcode > Product > Archive > Export

安装Ad Hoc分发的应用 Open iTunes > File > Add To Library… > select Ad Hoc provisioning profile and App.ipa > Sync

2.Xcode编译出现如下警告提示:

[WARN]warning: no rule to process file xxx.h’ of type sourcecode.c.h for architecture armv7

解决办法:这是因为检查到有.h文件在编译列表中了。所以只要在列表中去掉就可以了。

点击你的xcode项目文件,然后点击[Build Phases],确保在[Compile Sources]中没有.h文件。

Reference:Xcode编译提示:warning: no rule to process file ‘xxx.h’ of type sourcecode.c.h for architecture armv7

继续阅读

如何创建私有的Pod

公司的框架代码大多数时候是需要保密的,而手动的复制导入比较麻烦,这时候我们可以创建私有 Pod 来方便我们的日常开发工作,本文是我创建私有 Pod 的笔记。

Cocoapods 提供了 pod lib create [pod name] 来创建私有库工程,但是有个 embedded dylibs/frameworks are only supported on iOS 8.0 and later 的问题。 意思是只有部署 iOS 8 以上的应用才能使用它,所以要支持 iOS 8 以下的应用的 Pod 我们还是得手动创建,详细步骤如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
$ mkdir AJFrame

// Create static library
Xcode > File > New > Project... > Framework & Library > Cocoa Touch Static Libray 

// Create dev app
Xcode > File > New > Project... > Single View Application

// Result 
AJFrame
├── AJFrame
│   ├── AJFrame.xcodeproj
│   ├── AJFrameTests
│   ├── Classes
├── AJFrame.podspec
├── AJFrameDevApp
│   ├── AJFrameDevApp
│   ├── AJFrameDevApp.xcodeproj
│   ├── AJFrameDevApp.xcworkspace
│   ├── AJFrameDevAppTests
│   ├── Podfile
│   ├── Podfile.lock
│   └── Pods
└── LICENSE
继续阅读