多线程知识点(四)

  1. 使用SDWebImage下载图片

第一步:#import "UIImageView+WebCache.h"

第二步:[self.iconImageview sd_setImageWithURL:[NSURL URLWithString:model.icon]];

2. 使用layoutSubviews记得[super layoutSubviews]

  1. 使用Block 的三步:(以子线程下载为例)

1)             在下载工具里面添加Block的属性

2)             在工具类的下载方法的下载完成的Block里面调用定义好的block属性

3)             在需要进行下载操作的类里面,导入工具类,将工具类的Block属性进行赋值(通过Block的set方法),block回调时就会调用该类里面实现定义好的Block里面的内容

5.NSAssert(self.finishedBlcok != nil, @"self.finishedBlcok 为nil 哈哈");断言

自定义的下载工具类里面的下载实现

+(instancetype)DownloadImgWithUrlstr:(NSString *)urlstr finishedBlcok:(void (^)(UIImage *img))finishedBlcok

{

DownloadOperation *op = [[DownloadOperation alloc]init];

op.urlstr = urlstr;

op.finishedBlcok = finishedBlcok;

return op;

}

- (void)main

{

//子线程不能够访问主线程的自动释放池

//创建自动释放池

@autoreleasepool {

//断言

NSAssert(self.finishedBlcok != nil, @"self.finishedBlcok 为nil 哈哈");

NSLog(@"%@ %@",self.urlstr,[NSThread currentThread]);

// 图片下载

//模拟网络耗时

[NSThread sleepForTimeInterval:2.0];

NSURL *url = [NSURL URLWithString:self.urlstr];

NSData *data = [NSData dataWithContentsOfURL:url];

UIImage *img = [UIImage imageWithData:data];

//刷新ui回到主线程

[[NSOperationQueue mainQueue]addOperationWithBlock:^{

// 调用

//            if (self.finishedBlcok) {

//

//            }

self.finishedBlcok(img);

}];

}

}

6.取消操作,正在进行的操作也要停止下来的操作

[self.queue cancelAllOperations];

在下载成功时,刷新UI之前停止下来

//取消操作

if (self.isCancelled) {

return;

}

7.下载多个操作时,点击下载,取消之操作下载操作,保留最后的操作如果再次点击屏幕获取的图片地址与之前保存的图片地址不一样,那么取消之前的图片下载的操作

if (![model.icon isEqualToString:self.currentStr]) {

//取消上次操作

[self.operationCache[self.currentStr] cancel];

}

8.模仿SD创建下载操作的单例

+(instancetype)sharadDownloadOperationManager

{

static DownloadOperationManager *manager;

//一次性执行实现单例

static dispatch_once_t onceToken;

dispatch_once(&onceToken, ^{

if (manager == nil) {

manager = [[DownloadOperationManager alloc]init];

}

});

return manager;

}

9.取消下载操作的三个步骤

//判断urlstr是否为空

if (!键值) {

return;

}

//取消操作

[self.operationCache[urlstr] cancel];

//从操作缓存池移除已经取消的下载图片的操作

[self.operationCache removeObjectForKey:urlstr];

10.为分类添加属性:

采用运行时机制

#import <objc/runtime.h>

重写set  get 方法

-(NSString *)name

{

/*

参数1:添加属性的对象

参数2:添加属性对应的key

*/

return objc_getAssociatedObject(self, "itcast");

}

-(void)setName:(NSString *)name

{

/*

参数1:添加属性的对象

参数2:添加属性对应的key

参数3:添加属性的名称

参数4:修饰添加属性的修饰符

*/

objc_setAssociatedObject(self, "itcast", name, OBJC_ASSOCIATION_COPY_NONATOMIC);

}

11.老师写的模型类,高大上

+(instancetype)appInfoWith:(NSDictionary *)dic

{

AppModel *model = [[AppModel alloc]init];

//kvc

[model setValuesForKeysWithDictionary:dic];

return model;

}

+(NSArray *)appInfos

{

//路径

NSString *path = [[NSBundle mainBundle]pathForResource:@"apps.plist" ofType:nil];

//接收数据

NSArray *arr = [NSArray arrayWithContentsOfFile:path];

//可变数组

NSMutableArray *marr = [NSMutableArray arrayWithCapacity:10];

//遍历

[arr enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {

AppModel *model = [self appInfoWith:obj];

[marr addObject:model];

}];

//进行copy操作可以把可变数组变为不可变数组

return marr.copy;

}

时间: 2024-10-28 22:46:26

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

Java多线程(四)、线程池(转)

Java多线程(四).线程池 分类: javaSE综合知识点 2012-09-19 17:46 3943人阅读 评论(1) 收藏 举报 系统启动一个新线程的成本是比较高的,因为它涉及到与操作系统的交互.在这种情况下,使用线程池可以很好的提供性能,尤其是当程序中需要创建大量生存期很短暂的线程时,更应该考虑使用线程池. 与数据库连接池类似的是,线程池在系统启动时即创建大量空闲的线程,程序将一个Runnable对象传给线程池,线程池就会启动一条线程来执行该对象的run方法,当run方法执行结束后,该线

ExtJS4.2 Grid知识点四:改变表格Grid行文字颜色,划过Grid行时文字变粗

在ExtJS4.2 Grid知识点一:改变表格Grid单元格文字颜色一文中讲解了如何改变单元格中文字颜色,接下来在本章学习如何改变Grid中整行文字的颜色,这样就不需要为每列单独定义renderer函数,显示结果如图片: 在线演示  /  示例代码 实现方式是在Grid中设置viewConfig属性的getRowClass函数,函数参数列表如下: record: 当前待渲染行数据Model,类型为:Ext.data.Model rowIndex: 当前待渲染行数,类型为:Number rowPa

C++之易混淆知识点四---虚函数与虚继承

C++面向对象中,虚函数与虚继承是两个完全不同的概念. 一.虚函数 C++程序中只要类中含有虚拟函数,编译程序都会为此类生成一个对应的虚拟函数跳转表(vtbl),该虚拟函数跳转表是一个又若干个虚拟函数体入口地址组成的一个线性表.派生类的虚拟函数跳转表的前半部分由父类的vtbl得出,但是里面的内容不一定相同,后半部分则对应着自己新定义的虚拟函数. class Employee { protected: char *Name; int Age; public: void changeAge(int

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/huxi/archive/2010/06/26/1765808.html 本文介绍了Python对于线程的支持,包括“学会”多线程编程需要掌握的基础以及Python两个线程标准库的完整介绍及使用示例. 注意:本文基于Python2.4完成,:如果看到不明白的词汇请记得百度谷歌或维基,whatever. 1. 线程基础 1.1. 线程状态 线程有5种状态,状态转换的过程如下图所示: 1.2. 线程同步(锁) 多线程的优势在于可以同时运行多个任务(

iOS多线程全套:线程生命周期,多线程的四种解决方案,线程安全问题,GCD的使用,NSOperation的使用

目的 本文主要是分享iOS多线程的相关内容,为了更系统的讲解,将分为以下7个方面来展开描述. 多线程的基本概念 线程的状态与生命周期 多线程的四种解决方案:pthread,NSThread,GCD,NSOperation 线程安全问题 NSThread的使用 GCD的理解与使用 NSOperation的理解与使用 Demo在这里:WHMultiThreadDemo Demo的运行gif图如下: 一.多线程的基本概念 进程:可以理解成一个运行中的应用程序,是系统进行资源分配和调度的基本单位,是操作

“全栈2019”Java多线程第四章:设置和获取线程名称

难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多线程第四章:设置和获取线程名称 下一章 "全栈2019"Java多线程第五章:线程睡眠sleep()方法详解 学习小组 加入同步学习小组,共同交流与进步. 方式一:关注头条号Gorhaf,私信"Java学习小组". 方式二:关注公众号Gorhaf,回复"Jav

“全栈2019”Java多线程第四十二章:获取线程与读写锁的保持数

难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多线程第四十二章:获取线程与读写锁的保持数 下一章 "全栈2019"Java多线程第四十三章:查询是否有线程在等待读写锁 学习小组 加入同步学习小组,共同交流与进步. 方式一:关注头条号Gorhaf,私信"Java学习小组". 方式二:关注公众号Gorhaf,回复&quo

“全栈2019”Java多线程第四十六章:判断任意线程是否已持有写锁

难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多线程第四十六章:判断任意线程是否已持有写锁 下一章 "全栈2019"Java多线程第四十七章:判断锁是否为公平锁isFair() 学习小组 加入同步学习小组,共同交流与进步. 方式一:加入编程圈子. 方式二:关注头条号Gorhaf,私信"Java学习小组". 方式三:关

“全栈2019”Java多线程第四十七章:判断锁是否为公平锁isFair()

难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多线程第四十七章:判断锁是否为公平锁isFair() 下一章 "全栈2019"Java多线程第四十八章:读写锁实战高并发容器 学习小组 加入同步学习小组,共同交流与进步. 方式一:加入编程圈子. 方式二:关注头条号Gorhaf,私信"Java学习小组". 方式三:关注公众