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 的使用的更多相关文章

  1. iOS CFNetwork报错

    2016-11-16 10:05:35.082 天天送[46197:11758717] 46197: CFNetwork internal error (0xc01a:/BuildRoot/Libra ...

  2. CFNetwork SSLHandshake failed (-9824) ios 9

    设置 NSAppTransportSecurity

  3. iOS开发系列--音频播放、录音、视频播放、拍照、视频录制

    --iOS多媒体 概览 随着移动互联网的发展,如今的手机早已不是打电话.发短信那么简单了,播放音乐.视频.录音.拍照等都是很常用的功能.在iOS中对于多媒体的支持是非常强大的,无论是音视频播放.录制, ...

  4. ios 常见问题解决

    一,libxml/HTMLparser.h file not find 第一种方法: 点击左边项目的根目录,再点击右边的Build Settings,手工输入文字:“Header search pat ...

  5. iOS 支持 IPv6

    苹果的规定:2016年6月1日提交到App Store必须支持IPv6-only网络. 官方文档:https://developer.apple.com/library/mac/documentati ...

  6. ios开发中的小技巧

    在这里总结一些iOS开发中的小技巧,能大大方便我们的开发,持续更新. UITableView的Group样式下顶部空白处理 //分组列表头部空白处理 UIView *view = [[UIViewal ...

  7. iOS面试必看

    转载:http://www.jianshu.com/p/5d2163640e26 序言 目前形势,参加到iOS队伍的人是越来越多,甚至已经到供过于求了.今年,找过工作人可能会更深刻地体会到今年的就业形 ...

  8. 李洪强iOS经典面试题153- 补充

    李洪强iOS经典面试题153- 补充   补充 有空就来解决几个问题,已经懒癌晚期没救了... UML 统一建模语言(UML,UnifiedModelingLanguage)是面向对象软件的标准化建模 ...

  9. 【转】GitHub 排名前 100 的安卓、iOS项目简介

    GitHub Android Libraries Top 100 简介 排名完全是根据 GitHub 搜索 Java 语言选择 (Best Match) 得到的结果, 然后过滤了跟 Android 不 ...

随机推荐

  1. scala 学习笔记二 方法与函数

    1.介绍 Scala 有方法与函数,二者在语义上的区别很小.Scala 方法是类的一部分,而函数是一个对象可以赋值给一个变量.换句话来说在类中定义的函数即是方法. Scala 中的方法跟 Java 的 ...

  2. 解决WordPress 页面无法评论的问题

    最近在使用WordPress制作一个企业网站,因为是企业网站所以文章和页面都不需要评论功能,因此在主题里禁用掉了评论功能 //禁用页面和文章的评论功能//add_filter('the_posts', ...

  3. xpath语法速查

    xpath的具体学习可以通过w3c查看(链接:http://www.w3school.com.cn/xpath/index.asp) 这里只是将平时用到的几个表格贴出来,以后查询: 这里的xpath我 ...

  4. [转]intellij 13新建javaweb项目并用tomcat 7启动

    来自:http://blog.csdn.net/little__zm/article/details/19570535 对intellij不熟,找了很多文章,只这篇最为顺利.其他都有各种各校的问题,先 ...

  5. ThinkPHP的A方法,R方法,M方法,D方法区别

    在Thinkphp中,实例化对象有这么几种方法,如果是类,有A和R方法,区别是A方法只是对象的实例化,而R方法是可以同时实例化对象里面的方法的,这里需要去指定,如下面的实例代码: <?php n ...

  6. Element学习

    生成 HTML 文档初始结构 HTML 文档的初始结构,就是包括 doctype.html.head.body 以及 meta 等内容.你只需要输入一个 “!” 就可以生成一个 HTML5 的标准文档 ...

  7. reset.css 和 flexible.js

    重置css默认样式(淘宝): body, h1, h2, h3, h4, h5, h6, hr, p, blockquote, dl, dt, dd, ul, ol, li, pre, form, f ...

  8. Linux系统重装与还原

    当初第一次装ubuntu系统时,对文件系统的构成还不太了解,所以在分区的时候给home的分区特别小,导致后期软件都装不进去.说磁盘已满.所以想对系统又一次分区. 上网找了资料,都说用GParted这个 ...

  9. MVC日期和其它字符串格式化

    -- (月份位置不是03) string.Format("{0:D}",System.DateTime.Now) 结果为:2009年3月20日 : :: -- : -- :: st ...

  10. 指定spring中bean启动的顺序

    参考链接: https://www.jb51.net/article/125846.htm 使用DependsOn Spring 中的 DependsOn 注解可以保证被依赖的bean先于当前bean ...