iOS深入理解GCD 第四篇(dispatch_barrier_async)

本文摘自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.lxweimin.com/p/9ed95082f256 dispatch_barrier_sync和dispatch_barrier_async的對比

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容