Threading

在前一章提到,iOS 有一项系统限制:如果我们的程序中某个操作超过一定时间,那么系统就会认为我们的应用程式没有回应,而会强制关闭我们的App,当App 被强制关闭的时候,外观上会非常像是当机。如果是在Mac 上,就会看到滑鼠图示变成沙滩球不断旋转,最后App 一样被强制关闭。

但是我们的App 往往会有许多需要花时间的操作,像是网络请求抓取资料,或是local 的档案处理。所以,在这些场合,我们需要将工作丢到背景thread 执行,在工作完成之后、或是需要更新进度的时机,才告诉main thread 更新UI。

Thread 通常翻译成「线程」或是「执行绪」,也就是在同一个process(也就是同一个app 中),会同时存在、进行多条的程式执行路径,每条执行路径之间,不用等到某条执行路径结束,另外一条执行路径才能开始。作业系统会安排某条thread 在CPU 的某个核心上执行,或是会先打断某条thread,让其他的thread 先执行。

以网络连接来说,我们会避免使用NSData或NSString的-initWithContentsOfURL:这个API,而使用NSURLSession或NSURLConnection发送非同步的连线,NSURLSession与NSURLConnection在做的事情,便是将抓取资料这件工作放在其他thread中执行,然后在必要的时候callback —在这边我们要顺道注意一下,其实像NSURLSession的data task的callback block,也是在背景thread中执行。

在iOS 与Mac OS X 上,我们可以呼叫低阶的POSIX thread,不过既然有比较高阶的API,我们自然会选择使用高阶API。我们通常在iOS 与Mac OS X 上使用三种方式处理Multi-thread 的问题,分别是:

  • Perform Selector
  • GCD (Grand Centeral Dispatch)
  • NSOperation 与NSOperationQueue

results matching ""

    No results matching ""