美文网首页iOS开发专区
iOS深入理解GCD 第四篇(dispatch_barrier_

iOS深入理解GCD 第四篇(dispatch_barrier_

作者: 镜花水月cy | 来源:发表于2017-09-08 16:05 被阅读43次

    本文摘自http://www.cnblogs.com/ziyi--caolu/p/4900650.html

    在访问数据库或者文件的时候,我们可以使用dispatch_barrier_async避免数据竞争问题,代码如下:

    #import <Foundation/Foundation.h>
     
    @interface ZYPerson : NSObject
    @property (nonatomic, copy) NSString *name;
    @end
     
     
    #import "ZYPerson.h"
     
    @interface ZYPerson ()
    @end
     
    static NSString *_name;
    static dispatch_queue_t _concurrentQueue;
    @implementation ZYPerson
    - (instancetype)init
    {
        if (self = [super init]) {
           _concurrentQueue = dispatch_queue_create("com.person.syncQueue", DISPATCH_QUEUE_CONCURRENT);
        }
        return self;
    }
    - (void)setName:(NSString *)name
    {
        dispatch_barrier_async(_concurrentQueue, ^{
            _name = [name copy];
        });
    }
    - (NSString *)name
    {
        __block NSString *tempName;
        dispatch_sync(_concurrentQueue, ^{
            tempName = _name;
        });
        return tempName;
    }
    @end
    

    需求:多个getter方法(也就是读取)是可以并发执行的,而getter(读)与setter(写)方法是不能并发执行的。

    在队列中,barrier块必须单独执行,不能与其他block并行。这只对并发队列有意义,并发队列如果发现接下来要执行的block是个barrier block,那么就一直要等到当前所有并发的block都执行完毕,才会单独执行这个barrier block代码块,等到这个barrier block执行完毕,再继续正常处理其他并发block。

    因此在上面的代码中,setter方法中使用了barrier block以后,对象的读取操作依然是可以并发执行的,但是写入操作就必须单独执行了

    附上一个链接 http://www.jianshu.com/p/9ed95082f256 dispatch_barrier_sync和dispatch_barrier_async的对比

    相关文章

      网友评论

        本文标题:iOS深入理解GCD 第四篇(dispatch_barrier_

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