iOS网络编程
iOS 系统架构
开始介绍iOS网络编程之前介绍一下iOS 系统架构。
iOS的系统架构分为四个层次:核心操作系统层(Core OS layer)、核心服务层(Core Services layer)、媒体层(Media layer)和可触摸层(Cocoa Touch layer)。
- 位于iOS系统架构最下面的一层是核心操作系统层(Core OS layer),它包括内存管理、文件系统、电源管理以及一些其他的操作系统任务。它可以直接和硬件设备进行交互。核心操作系统层包括以下这些组件:Accelerate Framework、External Accessory Framework、Security Framework、System等几个框架,基本都是基于c语言的接口。
- 第二层是核心服务层,我们可以通过它来访问iOS的一些服务。包含:Address Book Framework、CFNetwork Framework、Core Data Framework、Core Foundation Framework、Core Location Framework、Core Media Framework、Core Telephony Framework、Event Kit Framework、Foundation Framework、Mobile Core Services Framework、Quick Look Framework、Store Kit Framework、System Configuration Framework、Block Objects、Grand Central Dispatch 、In App Purchase、Location Services、SQLite、XML Support等一些框架,也基本都是基于c语言的接口。
- 第三层是媒体层,通过它我们可以在应用程序中使用各种媒体文件,进行音频与视频的录制,图形的绘制,以及制作基础的动画效果。它包括以下这些组件:
Core Audio OpenGL Audio Mixing Audio Recording Video Playback JPG,PNG,TIFF PDF Quartz Core Animation OpenGL ES - 第四层是可触摸层,这一层为我们的应用程序开发提供了各种有用的框架,并且大部分与用户界面有关,本质上来说它负责用户在iOS设备上的触摸交互操作。它包括以下这些组件: Multi-Touch Events Core Motion Camera View Hierarchy Localization Alerts Web Views Image Picker Multi-Touch Controls.
** cocoa 很多组件都有两种实现,一种是基于 C 的以 CF 开头的类(CF=Core Foundation),这是比较底层的;另一种是基于 Obj-C 的以 NS 开头的类(NS=Next Step),这种类抽象层次更高,易于使用。**
简单介绍下 Core Foundation 与 cocoa Foundation 区别:
** Core Foundation框架 (CoreFoundation.framework) 是一组C语言接口,它们为iOS应用程序提供基本数据管理和服务功能。位于第二层核心服务层**
cocoa Foundation框架位于第四层。
iOS 系统网络编程
和大多数组件一样iOS网络编程层次结构也分为三层
- Cocoa层:NSURL,Bonjour,Game Kit,WebKi。这层是最上层的基于 Objective-C 的 API,比如 URL访问,NSStream,Bonjour,GameKit等,这是大多数情况下我们常用的 API。Cocoa 层是基于 Core Foundation 实现的。(可触摸层)
- Core Foundation层:基于C的CFNetwork和CFNetServices。因为直接使用 socket 需要更多的编程工作,所以苹果对 OS 层的 socket 进行简单的封装以简化编程任务。该层提供了 CFNetwork 和 CFNetServices,其中 CFNetwork 又是基于 CFStream 和 CFSocket。(核心服务层)
- OS层:基于C的BSD socket。(核心操作系统层)
这里我们主要介绍Core Foundation层中CFStream和位于Cocoa层的NSStream。
NSStream 其实只是用Objective-C对CFNetwork 的简单封装,它使用名为 NSStreamDelegate 的协议来实现 CFNetwork 中的回调函数的作用,同样,runloop 也与 NSStream 结合的很好。NSStream 有两个实体类:NSInputStream 和 NSOutputStream,分别对应 CFNetwork 中的 CFReadStream 和 CFWriteStream。
NSStream,NSInputStream,NSOutputStream. 它们都是与流操作有关的类。NSStream是抽象类,它定义了流对象的基本接口和属性。NSInputStream和NSOutputStream是NSStream的子类,它们实现了输入流和输出流的基本操作。
- 你可以为存储在内存中,向文件或者C buffer写入流数据创建NSOutputStream对象。使用NSOutputStream可以将网络请求的资源回来的数据保存到本地文件,通过输出流对象,将数据写入到指定的文件中。。
- 可以为从NSData对象和文件中读取的流数据创建NSInputStream对象;使用NSInputStream把文件上传到服务器。比喻说图片保存到服务器。
- 可以在网络套接字的两端创建NSInputStream和NSOutputStream对象,通过流对象,你可以不用一次性将所有的流数据加载到内存中。