iOS - CFNetwork 的使用
1、CFNetwork
CFNetwork 是基于 OS 层 BSDSocket 封装(纯 C),用于网络通信,早期的网络请求框架 ASIHTTPRequest 就是基于 CFNetwork 进行的封装。
主要使用的 API:CFSocket 用于底层的通信,CFStream 用于数据的读写。
2、基本使用
2.1 下载图片
下载图片
#import <CFNetwork/CFNetwork.h> @interface ViewController () @property (weak, nonatomic) IBOutlet UIImageView *imageV; @property (nonatomic, strong) NSMutableData *imageData; @end @implementation ViewController - (IBAction)requestImage:(id)sender { [UIApplication sharedApplication].networkActivityIndicatorVisible = YES; [NSThread detachNewThreadSelector:@selector(startRequest) toTarget:self withObject:nil];
} - (void)startRequest { // url
CFStringRef urlStr = CFSTR("http://pics.sc.chinaz.com/files/pic/pic9/201605/apic20649.jpg"); // GET 请求
CFStringRef method = CFSTR("GET"); // 构造 url
CFURLRef url = CFURLCreateWithString(kCFAllocatorDefault, urlStr, NULL); // http 请求
CFHTTPMessageRef request = CFHTTPMessageCreateRequest(kCFAllocatorDefault, method, url, kCFHTTPVersion1_1);
CFRelease(url); // 创建一个读取流,读取网络数据
CFReadStreamRef readStream = CFReadStreamCreateForHTTPRequest(kCFAllocatorDefault, request);
CFRelease(request); // 设置流的 context,这里将 self 传入,用于回调
CFStreamClientContext ctx = {0, (__bridge void *)(self), NULL, NULL, NULL}; // 设置回调事件,用于监听网络事件
// kCFStreamEventNone,(没有事件发生)
// kCFStreamEventOpenCompleted,(流被成功打开)
// kCFStreamEventHasBytesAvailable,(有数据可以读取)
// kCFStreamEventCanAcceptBytes,(流可以接受写入数据(用于写入流))
// kCFStreamEventErrorOccurred,(在流上有错误发生)
// kCFStreamEventEndEncountered ,(到达了流的结束位置)
CFOptionFlags event = kCFStreamEventHasBytesAvailable | kCFStreamEventEndEncountered; CFReadStreamSetClient(readStream, event, myCallBack, &ctx); // 打开输入流
CFReadStreamOpen(readStream); // 将流加入到 runloop 中
CFReadStreamScheduleWithRunLoop(readStream, CFRunLoopGetCurrent(), kCFRunLoopCommonModes); // 开启 runloop
CFRunLoopRun();
} // 回调函数
void myCallBack(CFReadStreamRef stream, CFStreamEventType type, void *clientCallBackInfo) { ViewController *selfClass = (__bridge ViewController *)clientCallBackInfo; if (type == kCFStreamEventHasBytesAvailable) { UInt8 buff[255];
CFIndex length = CFReadStreamRead(stream, buff, 255); if (!selfClass.imageData) {
selfClass.imageData = [NSMutableData data];
}
[selfClass.imageData appendBytes:buff length:length];
} if (type == kCFStreamEventEndEncountered) { [UIApplication sharedApplication].networkActivityIndicatorVisible = NO; [selfClass requestImageComplete]; // 关闭流
CFReadStreamClose(stream); // 将流从 runloop 中移除
CFReadStreamUnscheduleFromRunLoop(stream, CFRunLoopGetCurrent(), kCFRunLoopCommonModes);
}
} - (void)requestImageComplete { UIImage *image = [UIImage imageWithData:self.imageData];
self.imageV.image = image;
} @end

iOS - CFNetwork 的使用的更多相关文章
- iOS CFNetwork报错
2016-11-16 10:05:35.082 天天送[46197:11758717] 46197: CFNetwork internal error (0xc01a:/BuildRoot/Libra ...
- CFNetwork SSLHandshake failed (-9824) ios 9
设置 NSAppTransportSecurity
- iOS开发系列--音频播放、录音、视频播放、拍照、视频录制
--iOS多媒体 概览 随着移动互联网的发展,如今的手机早已不是打电话.发短信那么简单了,播放音乐.视频.录音.拍照等都是很常用的功能.在iOS中对于多媒体的支持是非常强大的,无论是音视频播放.录制, ...
- ios 常见问题解决
一,libxml/HTMLparser.h file not find 第一种方法: 点击左边项目的根目录,再点击右边的Build Settings,手工输入文字:“Header search pat ...
- iOS 支持 IPv6
苹果的规定:2016年6月1日提交到App Store必须支持IPv6-only网络. 官方文档:https://developer.apple.com/library/mac/documentati ...
- ios开发中的小技巧
在这里总结一些iOS开发中的小技巧,能大大方便我们的开发,持续更新. UITableView的Group样式下顶部空白处理 //分组列表头部空白处理 UIView *view = [[UIViewal ...
- iOS面试必看
转载:http://www.jianshu.com/p/5d2163640e26 序言 目前形势,参加到iOS队伍的人是越来越多,甚至已经到供过于求了.今年,找过工作人可能会更深刻地体会到今年的就业形 ...
- 李洪强iOS经典面试题153- 补充
李洪强iOS经典面试题153- 补充 补充 有空就来解决几个问题,已经懒癌晚期没救了... UML 统一建模语言(UML,UnifiedModelingLanguage)是面向对象软件的标准化建模 ...
- 【转】GitHub 排名前 100 的安卓、iOS项目简介
GitHub Android Libraries Top 100 简介 排名完全是根据 GitHub 搜索 Java 语言选择 (Best Match) 得到的结果, 然后过滤了跟 Android 不 ...
随机推荐
- OTL翻译(9) --常量的SQL语句
常量的SQL语句 一个没有绑定变量的SQL语句.SQL语句块或是存储过程就被称为常量的SQL语句.OTL通过一个静态的函数来执行这样的SQL语句. 例如: // static otl_cursor:: ...
- 使用标准模板find函数来对结构体容器进行查找
最近在写一个项目,项目中需要获得类下面的所有对象,所以我采用了map容器,以string为关键字,list容器为内容来进行查找,而list中是一些struct结构体.由于在插入操作的时候需要判断该对象 ...
- [置顶] 一道经典的sql面试题不同的写法
用一条SQL语句 查询出每门课都大于80分的学生姓名,表( #test)如下: Name Course Mark 张三 语文 81 张三 数学 75 李四 语文 76 李四 数学 90 王五 ...
- python部分重点底层源码剖析
Python源码剖析—Set容器(hashtable实现) python源码剖析(内存管理和垃圾回收)
- VS2010调试技巧
最近合作开发,代码已经完成了,但是一调试,错误一大堆,由于是合作开发,不确定是哪层的错误,得一步步得走,很是费时费力,平时调试的技巧用的不多,现在集中调试,结果有些手忙脚乱,效率也很低,所以在网上找了 ...
- 使用SqlServer中的float类型时发现的问题
在做项目中,使用了float类型来定义一些列,如:Price,但是发现了很多问题1.当值的位数大于6位是float型再转varchar型的时候会变为科学技术法显示 此时只好将float型转换成n ...
- python3 把excel文件合并并保存到csv文件
具体是这样,某路径下有很多 excel文件,文件名中包含相同关键字的是一类文件,把包含相同关键字的文件合并成一个文件,生成一个新的csv文件 # coding=utf-8 import xlrd im ...
- 【HBase】学习笔记
HBASE 1 简介 1.1 官网 1.1.1 http://hbase.apache.org/ 1.1.2 Apache HBase™ is the Hadoop database, a distr ...
- [转] ssh穿透??未验证。。。
一. SSH ProxyCommand 实践 http://www.cnblogs.com/shanpow/p/4264867.html 二. SSH穿越跳板机:一条命令跨越跳板机直接登陆远程计算机 ...
- matlab:eval用法
1.自动生成变量 % auto general variabalsb=rand(3,3)for i=1:8 eval(['a_',num2str(i),'=','b(',num2str(i),' ...