2019-05-20
持续更新中
2019-05-25
如果只是单纯的请求很简单,但是如果把它做得很健壮,很难啊!
2019-05-28
看了有一段时间了,简单写一下自己的了解
CFNetwork是基于C封装的网络层,相比与当前的使用的NSUrl封装层还要低级,属于
Core Foundation层.CFNetwork的基础是CFSocket和CFStream。从代码中操作的是指针
可以看出很低级.
前段时间看了一下ASI的源码感觉写的很好可惜自己工作得时候已经停更了所以一直用的AFN.最近给自己个机会了解一下这个CF.
下面通过编写GET和POST请求学习一下.
属性了解
-
CFURLRef=>NSURL
-
CFStringRef=>NSString
-
CFHTTPMessageRef=>NSURLRequest
-
CFHTTPMessageSetHeaderFieldValue=>设置header
-
CFReadStreamRef=>流
-
GET请求
- (void)getRequest{
//请求方式
CFStringRef requestMethod = CFSTR("GET");
//链接转CFString()
//CFStringRef requestUrlStr = (__bridge CFStringRef)urlString;
CFStringRef requestUrlStr = CFSTR("http://v.juhe.cn/joke/content/list.php?key=cf8b72d4930036755933fc9f4b157443&page=2&pagesize=10&sort=asc&time=1418745237");
//urldu对象
CFURLRef requestUrl = CFURLCreateWithString(kCFAllocatorDefault, requestUrlStr, NULL);
//HTTP消息对象
CFHTTPMessageRef messageObj = CFHTTPMessageCreateRequest(kCFAllocatorDefault, requestMethod, requestUrl, kCFHTTPVersion1_1);
//接下来开始设置请求头下面这个是我设置的Content-Type
CFStringRef headerKey = CFSTR("Content-Type");
CFStringRef headerValue = CFSTR("application/x-www-form-urlencoded; charset=utf-8");
CFHTTPMessageSetHeaderFieldValue(messageObj, headerKey,headerValue);
//创建读取流的对象
CFReadStreamRef readStream = CFReadStreamCreateForHTTPRequest(kCFAllocatorDefault, messageObj);
//设置监听
CFStreamClientContext ctxt = {0, (__bridge void *)(self), NULL, NULL, NULL};
//设置回调相关参数
// kCFStreamEventNone = 0,kCFStreamEventOpenCompleted = 1,kCFStreamEventHasBytesAvailable = 2,kCFStreamEventCanAcceptBytes = 4,kCFStreamEventErrorOccurred = 8,kCFStreamEventEndEncountered = 16
//第一个参数监听的对象,第二个参数监听的事件,第三个参数监听的回调方法,第四个参数(没看明白)
CFReadStreamSetClient(readStream, kCFStreamEventHasBytesAvailable|kCFStreamEventOpenCompleted|kCFStreamEventNone|kCFStreamEventCanAcceptBytes|kCFStreamEventErrorOccurred|kCFStreamEventEndEncountered, readStreamCallBack, &ctxt);
//将读取流加入到runLoop
//第一个参数流对象,第二个获取当前的runloop,第三个参数runloop的类型
CFReadStreamScheduleWithRunLoop(readStream, CFRunLoopGetCurrent(), kCFRunLoopCommonModes);
//最后一步开启流
//这个是有返回值得
if (CFReadStreamOpen(readStream)) {
NSLog(@"开启成功");
//开启runLoop
CFRunLoopRun();
}else{
NSLog(@"开启失败");
}
}
请求的回调
void readStreamCallBack(CFReadStreamRef stream,CFStreamEventType type,void *clientCallBackInfo){
UInt8 buf[1024];
switch (type) {
case kCFStreamEventNone:
NSLog(@"没有任何事发生");
break;
case kCFStreamEventOpenCompleted:
NSLog(@"流打开成功");
break;
case kCFStreamEventHasBytesAvailable:
//定义一个用来接收数据
CFReadStreamRead(stream, buf, 1024);
printf("%s",buf);
NSLog(@"有数据可以读取了");
break;
case kCFStreamEventCanAcceptBytes:
NSLog(@"能接收读取数据了");
break;
case kCFStreamEventErrorOccurred:
NSLog(@"肯定出错了");
break;
case kCFStreamEventEndEncountered:
NSLog(@"流结束了,这个时候可以装接收到的buf数据转成我们需要的格式比如转json");
//需要关闭流地址
CFReadStreamClose(stream);
//从runLoop中移除
CFReadStreamUnscheduleFromRunLoop(stream, CFRunLoopGetCurrent(), kCFRunLoopCommonModes);
break;
default:
NSLog(@"不知道咋啦");
break;
}
}
一个简单的GET请求就写好了POST请求跟他是类似的,添加body
其实这只是皮毛,真正的核心还没有接触到,还得继续研究.
持续更新中......
相关推荐:
文档翻译->建议阅读
CFNetwork
内容详解
网友评论