说起线程,不会陌生了,操作系统课程里已经详细介绍了这个东东,这里就不解释了,想要了解的问问百度或者翻翻书。

线程的创建

总结了昨天的学习,有下面几种创建的方式。

        //第一种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请求,定时器相关推荐

  1. ios开发笔记之 线程间通信

    performSelectorOnMainThread:selector:waitUntilDone: 用于线程间通信 使两个线程同步或者时异步执行. block阻塞 转载于:https://www. ...

  2. iOS开发里的线程安全机制

    [编者按]本文为再读苹果<Threading Programming Guide>笔记第四篇,主要分享了线程安全机制以及设计时所需要注意的事项.从最初的"什么是线程"到 ...

  3. iOS开发笔记-两种单例模式的写法

    iOS开发笔记-两种单例模式的写法 单例模式是开发中最常用的写法之一,iOS的单例模式有两种官方写法,如下: 不使用GCD #import "ServiceManager.h"st ...

  4. iOS开发多线程篇—线程的状态

    iOS开发多线程篇-线程的状态 一.简单介绍 线程的创建: self.thread=[[NSThread alloc]initWithTarget:self selector:@selector(te ...

  5. IOS开发笔记之推广安装(用网页判断是否安装App)

    IOS开发笔记之推广安装(用网页判断是否安装App) 在做App推广的时候,我们经常会用到网页链接下载,亦或是一张二维码,最常见的做法就是将App在iTunes中的下载链接嵌入,当用户扫描或者点击网页 ...

  6. Android开发笔记(五十)定时器AlarmManager

    Timer和TimerTask Java中的定时器机制有现成的方案,就是Timer+TimerTask.其中TimerTask用来描述时刻到达后的事务处理,而Timer用来调度定时任务,如何时启动.间 ...

  7. IOS开发笔记之常用的第三方库(太多了。)

    图像: 1.图片浏览控件MWPhotoBrowser  实现了一个照片浏览器类似 iOS 自带的相册应用,可显示来自手机的图片或者是网络图片,可自动从网络下载图片并进行缓存.可对图片进行缩放等操作. ...

  8. iOS开发——高级篇——线程同步、线程依赖、线程组

    前言 对于iOS开发中的网络请求模块,AFNet的使用应该是最熟悉不过了,但你是否把握了网络请求正确的完成时机?本篇文章涉及线程同步.线程依赖.线程组等专用名词的含义,若对上述名词认识模糊,可先进行查 ...

  9. iOS开发笔记之八十一——2020 iOS面试总结《一》之干货篇

    ******阅读完此文,大概需要5分钟****** 这是我毕业之后第三次开始找工作了,适逢2019年底,我清楚地知道,iOS开发已经不是很景气了,尽管自己有名校以及大厂背景,但是自己一点都没有把握,自 ...

  10. iOS开发笔记 - 网络篇

    计算机网络基础   计算机网络是多台独立自主的计算机互联而成的系统的总称,最初建立计算机网络的目的是实现信息传递和资源共享.   如果说计算机是第二次世界大战的产物,那么计算机网络则是美苏冷战的产物. ...

最新文章

  1. 计算机视觉四大基本任务(分类、定位、检测、分割)
  2. Linux多台服务器共用密钥ssh自动登陆
  3. Ubuntu 14.04 安装 CUDA 问题及解决
  4. stm32单片机屏幕一直闪_STM32F407[3] 闪烁LED
  5. DbgView软件 查看VC++ MFC 程序的打印信息
  6. MyBatis中动态sql实现传递多个参数并使用if进行参数的判断和实现like模糊搜索以及foreach实现in集合
  7. Apache Commons:Commons-codec介绍
  8. hadoop重启后 9000端口不在
  9. 互联网系统性能优化方向
  10. 分析SQL Server备份
  11. 逼死强迫症?聊聊应用推送角标的那些事儿
  12. 语音信号特征处理--Fbank\MFCC
  13. Conflicted Confucians
  14. k8s 亲和、反亲和、污点、容忍
  15. 解决idea中每次创建项目都要重复配置maven,全网几步配置
  16. Linux Nginx安装配置及HTTPS配置
  17. Ehcache缓存时间设置
  18. 大规模分布式图学习框架Euler——安装和使用
  19. Android平板电脑刷机包简单解释
  20. Vue2.0快速入门

热门文章

  1. 此博客记录我的日常学习过程
  2. 导出excel乱码问题
  3. Shell子程序结构,函数
  4. n维空间的欧氏距离公式_什么是“欧几里得距离”(ED)?| 群体遗传专题
  5. python最新版安装图集_[python] plist图集拆分小图
  6. 计算机网络传输介质中速率最快的是,通常传输速率最快的网络类型是()
  7. window 装oracle,在Window下安装Oracle
  8. python哈希类型_python 入门之 – hash(十七)
  9. 哈工大2019计算机专业录取分数线,哈尔滨工业大学2019年高考分省分专业录取分数线...
  10. birt字体 linux,linux下birt 图表中文乱码问题