美文网首页
多线程篇

多线程篇

作者: 清风徐来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

    多线程详解

    相关文章

      网友评论

          本文标题:多线程篇

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