IOS开发笔记_5.线程,HTTP请求,定时器
说起线程,不会陌生了,操作系统课程里已经详细介绍了这个东东,这里就不解释了,想要了解的问问百度或者翻翻书。
线程的创建
总结了昨天的学习,有下面几种创建的方式。
//第一种NSThread *t = [[NSThread alloc] initWithTarget:self selector:@selector(mutitly) object:nil];[t start];
//第二种[NSThread detachNewThreadSelector:@selector(mutitly) toTarget:self withObject:nil];
//第三种,这种比较常用[self performSelectorInBackground:@selector(mutitly) withObject:nil];
//第四种NSOperationQueue *operationQueue = [[NSOperationQueue alloc] init];[operationQueue addOperationWithBlock:^{for (int i = 0 ; i < 20 ; i++) {NSLog(@"多线程 :%d",i);}}];
//第五种创建线程队列(线程池 )NSOperationQueue *operationQueue = [[NSOperationQueue alloc] init];//设置线程池中得并发数operationQueue.maxConcurrentOperationCount = 1 ;NSInvocationOperation *invocation1 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(thread1) object:nil];[invocation1 setQueuePriority:NSOperationQueuePriorityVeryLow];NSInvocationOperation *invocation2 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(thread2) object:nil];[invocation2 setQueuePriority:NSOperationQueuePriorityVeryHigh];[operationQueue addOperation:invocation1];[operationQueue addOperation:invocation2];
这个例子是在做实验的时候总结的
-(void)setImageWithURL:(NSURL *) url{//加载网络图片的时候应该开启一个线程,不然加载的时候会阻塞[self performSelectorInBackground:@selector(loadData:) withObject:url];//不推荐使用这种方法调用,因为这时候按钮会卡住//[self loadData:url]; }-(void)loadData:(NSURL *) url{@autoreleasepool {NSData *data = [NSData dataWithContentsOfURL:url];UIImage *image = [UIImage imageWithData:data];//在主线程上执行setImage方法[self performSelectorOnMainThread:@selector(setImage:) withObject:image waitUntilDone:YES];} }
应该注意的是,加载网络数据的时候,最好要开启一个新的线程,并且,要把网络上得图片加载到本地的话,应该在主线程上调用,这里调用的是performSelectorOnMainThread:方法,这个很重要,有关UI的操作都是在主线程上进行的。
HTTP请求
用户发送请求的时候有多种请求方式,比较常见的请求方式有两种
1、“get”请求:向服务器索取数据
2、“post”请求,向服务器提交数据,如“用户登录”等等。
同步请求(只能等服务器的数据完全返回响应后,程序才往下执行)
NSURL *url = [NSURL URLWithString:@"http://www.baidu.com"];NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];//设置请求方式[request setHTTPMethod:@"GET"];//设置请求时间[request setTimeoutInterval:50];NSURLResponse *respon ;NSError *error = nil;//发送一个同步请求NSData *data = [NSURLConnection sendSynchronousRequest:requestreturningResponse:&respon error:&error];NSInteger statusCode = [respon statusCode];NSLog(@"响应码:%d",statusCode);NSDictionary *headFields = [respon allHeaderFields];NSLog(@"响应头:%@",headFields);NSString *htmlstring = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];NSLog(@"%@",htmlstring);
异步请求(不用等服务器完全响应,程序边执行边加载数据)
- (IBAction)asynchAction:(id)sender {NSURL *url = [NSURL URLWithString:@"http://www.baidu.com"];NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];//设置请求方式[request setHTTPMethod:@"GET"];//设置请求时间[request setTimeoutInterval:50];//发送异步请求[NSURLConnection connectionWithRequest:request delegate:self];//第二种异步请求方式,用的不是很多 // NSOperationQueue *operationQueue = [[NSOperationQueue alloc] init]; // // [NSURLConnection sendAsynchronousRequest:request queue:operationQueue completionHandler:^(NSURLResponse *respon, NSData *data, NSError *error) { // if([NSThread isMultiThreaded]){ // NSLog(@"是多线程"); // } // // NSString *string = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; // NSLog(@"%@",string); // // }];
主要是要知道url,request的创建,还有请求的方式是同步还是异步。
总结一下访问网络的基本流程。
1、构造NSURL实例(地址)
2、生成NSURLRequest(请求)
3、通过NSURLConnection发送请求
4、通过NSURLRespond实例和NSError实例分析结果
5、接收返回的数据
还有几个比较常用的协议方法,NSURLConnectionDataDelegate
//服务器响应的方法- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;NSDictionary *allHeadFields = [httpResponse allHeaderFields];NSLog(@"%@",allHeadFields); } //接受数据的方法,会调用多次,每一次调用服务器的一部分数据data - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{[resultData appendData:data];} //数据加载完成调用的方法 - (void)connectionDidFinishLoading:(NSURLConnection *)connection{NSString *htmlString = [[NSString alloc] initWithData:resultData encoding:NSUTF8StringEncoding];NSLog(@"%@",htmlString);}
定时器
-(void)mutiThread{//多线程里面开启一个定时器可以提高精确度//启动定时器NSLog(@"定时器启动");@autoreleasepool {[NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(timerAction:) userInfo:nil repeats:YES];}//获取当前的runloop,线程就停在这里[[NSRunLoop currentRunLoop] run];NSLog(@"after"); }-(void)timerAction:(NSTimer *) timer {index++;NSLog(@"定时器打印");if (index == 5) {[timer invalidate];} }
实现的功能是每隔1秒钟就执行一次timerAction方法,一共执行五次,五次后打印后就结束
转载于:https://www.cnblogs.com/yueyingsuixing/p/3457790.html
IOS开发笔记_5.线程,HTTP请求,定时器相关推荐
- ios开发笔记之 线程间通信
performSelectorOnMainThread:selector:waitUntilDone: 用于线程间通信 使两个线程同步或者时异步执行. block阻塞 转载于:https://www. ...
- iOS开发里的线程安全机制
[编者按]本文为再读苹果<Threading Programming Guide>笔记第四篇,主要分享了线程安全机制以及设计时所需要注意的事项.从最初的"什么是线程"到 ...
- iOS开发笔记-两种单例模式的写法
iOS开发笔记-两种单例模式的写法 单例模式是开发中最常用的写法之一,iOS的单例模式有两种官方写法,如下: 不使用GCD #import "ServiceManager.h"st ...
- iOS开发多线程篇—线程的状态
iOS开发多线程篇-线程的状态 一.简单介绍 线程的创建: self.thread=[[NSThread alloc]initWithTarget:self selector:@selector(te ...
- IOS开发笔记之推广安装(用网页判断是否安装App)
IOS开发笔记之推广安装(用网页判断是否安装App) 在做App推广的时候,我们经常会用到网页链接下载,亦或是一张二维码,最常见的做法就是将App在iTunes中的下载链接嵌入,当用户扫描或者点击网页 ...
- Android开发笔记(五十)定时器AlarmManager
Timer和TimerTask Java中的定时器机制有现成的方案,就是Timer+TimerTask.其中TimerTask用来描述时刻到达后的事务处理,而Timer用来调度定时任务,如何时启动.间 ...
- IOS开发笔记之常用的第三方库(太多了。)
图像: 1.图片浏览控件MWPhotoBrowser 实现了一个照片浏览器类似 iOS 自带的相册应用,可显示来自手机的图片或者是网络图片,可自动从网络下载图片并进行缓存.可对图片进行缩放等操作. ...
- iOS开发——高级篇——线程同步、线程依赖、线程组
前言 对于iOS开发中的网络请求模块,AFNet的使用应该是最熟悉不过了,但你是否把握了网络请求正确的完成时机?本篇文章涉及线程同步.线程依赖.线程组等专用名词的含义,若对上述名词认识模糊,可先进行查 ...
- iOS开发笔记之八十一——2020 iOS面试总结《一》之干货篇
******阅读完此文,大概需要5分钟****** 这是我毕业之后第三次开始找工作了,适逢2019年底,我清楚地知道,iOS开发已经不是很景气了,尽管自己有名校以及大厂背景,但是自己一点都没有把握,自 ...
- iOS开发笔记 - 网络篇
计算机网络基础 计算机网络是多台独立自主的计算机互联而成的系统的总称,最初建立计算机网络的目的是实现信息传递和资源共享. 如果说计算机是第二次世界大战的产物,那么计算机网络则是美苏冷战的产物. ...
最新文章
- 计算机视觉四大基本任务(分类、定位、检测、分割)
- Linux多台服务器共用密钥ssh自动登陆
- Ubuntu 14.04 安装 CUDA 问题及解决
- stm32单片机屏幕一直闪_STM32F407[3] 闪烁LED
- DbgView软件 查看VC++ MFC 程序的打印信息
- MyBatis中动态sql实现传递多个参数并使用if进行参数的判断和实现like模糊搜索以及foreach实现in集合
- Apache Commons:Commons-codec介绍
- hadoop重启后 9000端口不在
- 互联网系统性能优化方向
- 分析SQL Server备份
- 逼死强迫症?聊聊应用推送角标的那些事儿
- 语音信号特征处理--Fbank\MFCC
- Conflicted Confucians
- k8s 亲和、反亲和、污点、容忍
- 解决idea中每次创建项目都要重复配置maven,全网几步配置
- Linux Nginx安装配置及HTTPS配置
- Ehcache缓存时间设置
- 大规模分布式图学习框架Euler——安装和使用
- Android平板电脑刷机包简单解释
- Vue2.0快速入门
热门文章
- 此博客记录我的日常学习过程
- 导出excel乱码问题
- Shell子程序结构,函数
- n维空间的欧氏距离公式_什么是“欧几里得距离”(ED)?| 群体遗传专题
- python最新版安装图集_[python] plist图集拆分小图
- 计算机网络传输介质中速率最快的是,通常传输速率最快的网络类型是()
- window 装oracle,在Window下安装Oracle
- python哈希类型_python 入门之 – hash(十七)
- 哈工大2019计算机专业录取分数线,哈尔滨工业大学2019年高考分省分专业录取分数线...
- birt字体 linux,linux下birt 图表中文乱码问题