多线程知识点(三)

  1. NSOperationQueue作为全局队列,可以设置最大并发数

-(NSOperationQueue *)queue

{

if (_queue == nil) {

_queue = [[NSOperationQueue alloc]init];

//最大并发数

_queue.maxConcurrentOperationCount  = }

return _queue;

}

2设置操作的暂停,继续,取消

- (IBAction)cancle:(id)sender {

//取消操作

[self.queue cancelAllOperations];

NSLog(@"取消");

}

//暂停  暂停还没有执行的操作,正在执行的操作继续执行

- (IBAction)suspend:(id)sender {

//Suspended 暂停

[self.queue setSuspended:YES];

NSLog(@"暂停");

}

//继续

- (IBAction)jixu:(id)sender {

[self.queue setSuspended:NO];

NSLog(@"继续");

}

3    .下载的耗时操作放在子线程里面执行,死循环放在子线程里面执行

4.采用[self.queue setSuspended:YES]进行将队列里面的操作暂停,里面的操作数不能过大,否则任务停止不下来

5.刷新ui的操作如果添加的太多,uishua’x刷新的速度就会加快,如果只有相同的刷新操作,只需要判断操作数的个数,例如

if (self.queue.operationCount == 0) {

[self.queue addOperationWithBlock:^{

刷新ui//在主线程执行

}];

如果刷新ui的操作并不止一种,可以添加操作缓存池

6. //设置服务质量ios8之后推荐 iOS8之前是优先级

[op setQualityOfService:NSQualityOfServiceUserInteractive];

7.添加多个操作(操作数组)

[self.queue addOperations:@[op,op2] waitUntilFinished:NO];

8.监听操作完成

[op2 setCompletionBlock:^{

NSLog(@"op2 CompletionBlock");

}];

9.设置操作依赖,可以是不同的队列里面的操作

[op2 addDependency:op];

[op3 addDependency:op2];

10.根据网址下载图片

//获取图片链接地址

NSURL *url = [NSURL URLWithString:model.icon];

//进行图片下载,二进制

NSData *data = [NSData dataWithContentsOfURL:url];

//把二进制转化成UIimage

UIImage *img = [UIImage imageWithData:data];

11. 获取模型给cell赋值 cell控件是懒加载

12.当收到内存警告的时候清空内存

//当收到内存警告的时候调用

- (void)didReceiveMemoryWarning

{

//清空图片缓存池

NSLog(@"didReceiveMemoryWarning");

}

13.设置图片缓存池(字典)

- (NSMutableDictionary *)imgCache

{

_imgCache = [NSMutableDictionary dictionaryWithCapacity:10];

}

return _imgCache;

}

为字典添加键值对

[self.imgCache setObject:img forKey:model.icon];

self.imgCache[model.icon] = img;

14.为了防止因为耗时操作,tableView的cell的imageView上面的图片出现下载错位的情况,可以在下载完成的时候,刷新tableView

15.为了节省用户的流量,可以将下载好的图片保存到图片缓存池(字典),先判断缓存池里面释放存在图片,没有再去下载

下载是耗时操作,可能未下载下来的时候已经添加到了队列当中,但是图片认为空,所以设置操作缓存池(字典),已近存在的操作就不继续添加到队列当中

16. 循环引用  self ->  queue,OperationCache -> op - >block - >self

17.为NSString创建一个分类 NSString+sandBox.h

创建三个类方法:获取沙河路径

//获取Cache路径

- (instancetype)appdendCache

{

return [[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:[self lastPathComponent]];

}

//获取Documents路径

- (instancetype)appdendDocuments

{

return [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:[self lastPathComponent]];

}

//获取Temp路径

- (instancetype)appdendTemp

{

return [NSTemporaryDirectory() stringByAppendingPathComponent:[self lastPathComponent]];

}

时间: 2024-10-19 05:29:18

多线程知识点(三)的相关文章

Java多线程(三)、线程同步(转)

Java多线程(三).线程同步 分类: javaSE综合知识点 2012-09-18 17:59 2400人阅读 评论(0) 收藏 举报 在之前,已经学习到了线程的创建和状态控制,但是每个线程之间几乎都没有什么太大的联系.可是有的时候,可能存在多个线程多同一个数据进行操作,这样,可能就会引用各种奇怪的问题.现在就来学习多线程对数据访问的控制吧. 由于同一进程的多个线程共享同一片存储空间,在带来方便的同时,也带来了访问冲突这个严重的问题.Java语言提供了专门机制以解决这种冲突,有效避免了同一个数

Java 多线程(三) 线程的生命周期及优先级

Java 多线程(三) 线程的生命周期及优先级 线程的生命周期 线程的生命周期:一个线程从创建到消亡的过程. 如下图,表示线程生命周期中的各个状态: 线程的生命周期可以分为四个状态: 1.创建状态: 当用new操作符创建一个新的线程对象时,该线程处于创建状态. 处于创建状态的线程只是一个空的线程对象,系统不为它分配资源. 2.可运行状态: 执行线程的start()方法将为线程分配必须的系统资源,安排其运行,并调用线程体——run()方法,这样就使得该线程处于可运行状态(Runnable). 这一

ExtJS4.2 Grid知识点三:改变表格Grid单元格背景颜色

在ExtJS4.2 Grid知识点一:改变表格Grid单元格文字颜色一文中讲解了如何改变单元格中文字颜色,接下来在本章学习如何改变Grid中单元格的背景颜色,显示结果如图片: 在线演示  /  示例代码 实现方式同样是为Grid中该列自定义renderer函数,查询ExtJS 4.2 API得知,Ext.grid.column.Column的renderer属性可以是一个函数也可以是字符串,这个知识点是通过函数来实现的.函数参数列表如下: value : 当前待渲染的单元格值,即表格中某行某列的

Java 多线程知识点整理

1.如何停止一个正在运行的线程? 使用共享变量,用volatile变量修饰,线程循环去访问该变量.如果线程因为发生某些事件进行阻塞,可以使用Thread的interrupt方法.可以使一个被阻塞的线程抛出一个中断异常,从而使线程提前结束阻塞状态,退出堵塞代码. class MyThread extends Thread { volatile boolean stop = false; public void run() { while (!stop) { System.out.println(g

python多线程(三)

原文:http://www.cnblogs.com/tqsummer/archive/2011/01/25/1944771.html 一.Python中的线程使用: Python中使用线程有两种方式:函数或者用类来包装线程对象. 1.  函数式:调用thread模块中的start_new_thread()函数来产生新线程.如下例: import time import thread def timer(no, interval): cnt = 0 while cnt<10: print 'Thr

“全栈2019”Java多线程第三十章:尝试获取锁tryLock()方法详解

难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多线程第三十章:尝试获取锁tryLock()方法详解 下一章 "全栈2019"Java多线程第三十一章:中断正在等待显式锁的线程 学习小组 加入同步学习小组,共同交流与进步. 方式一:关注头条号Gorhaf,私信"Java学习小组". 方式二:关注公众号Gorhaf,回复

“全栈2019”Java多线程第三十五章:如何获取线程被等待的时间?

难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多线程第三十五章:如何获取线程被等待的时间? 下一章 "全栈2019"Java多线程第三十六章:如何设置线程的等待截止时间 学习小组 加入同步学习小组,共同交流与进步. 方式一:关注头条号Gorhaf,私信"Java学习小组". 方式二:关注公众号Gorhaf,回复&qu

线程的状态以及创建多线程的三种方式

首先了解一下线程的五种状态: 新建状态: 新建状态是指new之后,即新创建了一个线程的时候,此时并未运行任何线程方法体内的程序代码. 就绪状态: 简单来说就是指程序调用了start()之后,线程就得到了启动,代表线程进入了就绪状态,但是此时并不代表它会立刻去执行run()方法体内的程序代码,而是随时等待cpu的调度. 运行状态: 获得cpu的时间后,调用run()方法,进入运行状态. 阻塞状态: 由于某种原因放弃了cpu的会用权力,暂时停止运行,等待再次被调用. 死亡状态: 线程正常执行完毕,或

面试知识点三:Java多线程

35.并行和并发有什么区别? 36.线程和进程的区别? 37.守护线程是什么? 38.创建线程有哪几种方式? 39.说一下 runnable 和 callable 有什么区别? 40.线程有哪些状态? 41.sleep() 和 wait() 有什么区别? 42.notify()和 notifyAll()有什么区别? 43.线程的 run()和 start()有什么区别? 44.创建线程池有哪几种方式? 45.线程池都有哪些状态? 46.线程池中 submit()和 execute()方法有什么区