美文网首页
iOS网络请求CFNetwork学习

iOS网络请求CFNetwork学习

作者: _菩提本无树_ | 来源:发表于2019-05-23 15:54 被阅读0次
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
内容详解

相关文章

网友评论

      本文标题:iOS网络请求CFNetwork学习

      本文链接:https://www.haomeiwen.com/subject/zlkbzqtx.html