博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iOS - CFNetwork 的使用
阅读量:7206 次
发布时间:2019-06-29

本文共 3091 字,大约阅读时间需要 10 分钟。

1、CFNetwork

  • CFNetwork 是基于 OS 层 BSDSocket 封装(纯 C),用于网络通信,早期的网络请求框架 ASIHTTPRequest 就是基于 CFNetwork 进行的封装。

  • 主要使用的 API:CFSocket 用于底层的通信,CFStream 用于数据的读写。

2、基本使用

2.1 下载图片

  • 下载图片

    #import 
    @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

    Socket15

转载地址:http://ohlum.baihongyu.com/

你可能感兴趣的文章
virtualBox中的centOS虚拟机硬盘扩容
查看>>
Android应用目录结构分析
查看>>
动画总结(UIView的动画)
查看>>
顶点着色器和片断着色器
查看>>
vc++实现禁用按钮
查看>>
flask with gae开发小结
查看>>
以打字形式展示placeholder的插件
查看>>
http文件导出写文件
查看>>
Globus的简单介绍
查看>>
[LeetCode] Search Insert Position 解题报告
查看>>
c# 的传递参数值传递与传递引用的区别,ref与out区别
查看>>
win7+vs2008+cuda5.x 环境配置二
查看>>
PHP5.5安装PHPRedis扩展
查看>>
c#Socket Tcp服务端编程
查看>>
java构造函数注意点
查看>>
Asp.net 中配置 CKEditor和CKFinder
查看>>
Use dynamic type in Entity Framework 4.1 SqlQuery() method
查看>>
《Python CookBook2》 第四章 Python技巧 - 若列表中某元素存在则返回之 && 在无须共享引用的条件下创建列表的列表...
查看>>
redhat网卡设置
查看>>
javascript 的作用域
查看>>