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

    Socket15

优秀的个人博客,低调大师

微信关注我们

原文链接:https://yq.aliyun.com/articles/312187

转载内容版权归作者及来源网站所有!

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

相关文章

发表评论

资源下载

更多资源
优质分享Android(本站安卓app)

优质分享Android(本站安卓app)

近一个月的开发和优化,本站点的第一个app全新上线。该app采用极致压缩,本体才4.36MB。系统里面做了大量数据访问、缓存优化。方便用户在手机上查看文章。后续会推出HarmonyOS的适配版本。

Mario,低调大师唯一一个Java游戏作品

Mario,低调大师唯一一个Java游戏作品

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Oracle Database,又名Oracle RDBMS

Oracle Database,又名Oracle RDBMS

Oracle Database,又名Oracle RDBMS,或简称Oracle。是甲骨文公司的一款关系数据库管理系统。它是在数据库领域一直处于领先地位的产品。可以说Oracle数据库系统是目前世界上流行的关系数据库管理系统,系统可移植性好、使用方便、功能强,适用于各类大、中、小、微机环境。它是一种高效率、可靠性好的、适应高吞吐量的数据库方案。

Apache Tomcat7、8、9(Java Web服务器)

Apache Tomcat7、8、9(Java Web服务器)

Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache、Sun 和其他一些公司及个人共同开发而成。因为Tomcat 技术先进、性能稳定,而且免费,因而深受Java 爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的Web 应用服务器。