美文网首页
多线程篇

多线程篇

作者: 清风徐来121 | 来源:发表于2020-10-28 09:30 被阅读0次
image.png image.png image.png image.png image.png image.png image.png
因为performSelector方法是需要依赖线程runLoop,但是开辟的子线程默认是没有开启runLoop的,所以方法调用不生效
PerformSelector详细总结 image.png
#import "UserCenter.h"

@interface UserCenter()
{
    // 定义一个并发队列
    dispatch_queue_t concurrent_queue;
    
    // 用户数据中心, 可能多个线程需要数据访问
    NSMutableDictionary *userCenterDic;
}

@end

// 多读单写模型
@implementation UserCenter

- (id)init
{
    self = [super init];
    if (self) {
        // 通过宏定义 DISPATCH_QUEUE_CONCURRENT 创建一个并发队列
        concurrent_queue = dispatch_queue_create("read_write_queue", DISPATCH_QUEUE_CONCURRENT);
        // 创建数据容器
        userCenterDic = [NSMutableDictionary dictionary];
    }
    
    return self;
}

- (id)objectForKey:(NSString *)key
{
    __block id obj;
    // 同步读取指定数据
    dispatch_sync(concurrent_queue, ^{
        obj = [userCenterDic objectForKey:key];
    });
    
    return obj;
}

- (void)setObject:(id)obj forKey:(NSString *)key
{
    // 异步栅栏调用设置数据
    dispatch_barrier_async(concurrent_queue, ^{
        [userCenterDic setObject:obj forKey:key];
    });
}

@end

dispatch_group_async的使用

#import "GroupObject.h"

@interface GroupObject()
{
    dispatch_queue_t concurrent_queue;
    NSMutableArray <NSURL *> *arrayURLs;
}

@end

@implementation GroupObject

- (id)init
{
    self = [super init];
    if (self) {
        // 创建并发队列
        concurrent_queue = dispatch_queue_create("concurrent_queue", DISPATCH_QUEUE_CONCURRENT);
        arrayURLs = [NSMutableArray array];
    }

    return self;
}

- (void)handle
{
    // 创建一个group
    dispatch_group_t group = dispatch_group_create();
    
    // for循环遍历各个元素执行操作
    for (NSURL *url in arrayURLs) {
        
        // 异步组分派到并发队列当中
        dispatch_group_async(group, concurrent_queue, ^{
            
            //根据url去下载图片
            
            NSLog(@"url is %@", url);
        });
    }
    
    dispatch_group_notify(group, dispatch_get_main_queue(), ^{
        // 当添加到组中的所有任务执行完成之后会调用该Block
        NSLog(@"所有图片已全部下载完成");
    });
}

@end
image.png image.png image.png image.png image.png image.png

重入导致了死锁,这种场景可以将NSLock换成递归锁


image.png image.png image.png image.png image.png

多线程详解

相关文章

  • iOS多线程篇:NSThread

    iOS多线程篇:NSThread iOS多线程篇:NSThread

  • iOS面试备战-多线程篇

    iOS面试备战-多线程篇iOS面试备战-多线程篇

  • java多线程相关

    (一) 基础篇 01.Java多线程系列--“基础篇”01之 基本概念 02.Java多线程系列--“基础篇”02...

  • iOS - Multi-Thread

    概念篇 进程 线程 多线程 单核多线程 & 多核多线程 并行 & 并发 同步 & 异步 队列 队列 & 任务 的执...

  • Python 主线程捕获子线程异常

    多线程异常 接上一篇Python手动中断(Ctrl-C)多线程程序,这一篇来探讨多线程程序中另一个问题:主线程捕获...

  • 多线程

    上一篇:协议当前篇:多线程 随着多核多线程处理器的出现,多线程编程技术也已经普及,我们之前写的代码都是在单一线程中...

  • Java多线程系列目录(共43篇)-转

    最近,在研究Java多线程的内容目录,将其内容逐步整理并发布。 (一) 基础篇 Java多线程系列--“基础篇”0...

  • 多线程(三)-为主线程减负的多线程方案

    再梳理一篇多线程的文章,正好续上之前的多线程章节,完善下这个章节内容。 一、多线程方案: ThreadPool: ...

  • IOS 多线程知识学习

    学习多线程,转载两篇大神的帖子,留着以后回顾!第一篇:关于iOS多线程,你看我就够了 第二篇:GCD使用经验与技巧...

  • 有个人催牛b

    Java多线程看着一篇足够了

网友评论

      本文标题:多线程篇

      本文链接:https://www.haomeiwen.com/subject/eplxvktx.html