GCD總結(jié)(二)

不再使用鎖(Lock)

用戶隊(duì)列可以用于替代鎖來(lái)完成同步機(jī)制。在傳統(tǒng)多線程編程中,你可能有一個(gè)對(duì)象要被多個(gè)線程使用,你需要一個(gè)鎖來(lái)保護(hù)這個(gè)對(duì)象:

NSLock *lock;

訪問(wèn)代碼會(huì)像這樣:

- (id)something

{

id localSomething;

[lock lock];

localSomething = [[something retain] autorelease];

[lock unlock];

return localSomething;

}

- (void)setSomething:(id)newSomething

{

[lock lock];

if(newSomething != something)

{

[something release];

something = [newSomething retain];

[self updateSomethingCaches];

}

[lock unlock];

}

使用GCD,可以使用queue來(lái)替代:

dispatch_queue_t queue;

要用于同步機(jī)制,queue必須是一個(gè)用戶隊(duì)列,而非全局隊(duì)列,所以使用usingdispatch_queue_create初始化一個(gè)。然后可以用dispatch_barrier_async和dispatch_sync將共享數(shù)據(jù)的訪問(wèn)代碼封裝起來(lái):

- (id)something

{

__block id localSomething;

dispatch_sync(queue, ^{

localSomething = [something retain];

});

return [localSomething autorelease];

}

- (void)setSomething:(id)newSomething

{

dispatch_barrier_async(queue, ^{

if(newSomething != something)

{

[something release];

something = [newSomething retain];

[self updateSomethingCaches];

}

});

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 什么是GCD? Grand Central Dispatch或者GCD,是一套低層API,提供了一種新的方法來(lái)進(jìn)行...
    傻傻小蘿卜閱讀 506評(píng)論 0 0
  • 史上最全的iOS面試題及答案 iOS面試小貼士———————————————回答好下面的足夠了----------...
    Style_偉閱讀 2,410評(píng)論 0 35
  • iOS面試小貼士 ———————————————回答好下面的足夠了------------------------...
    不言不愛(ài)閱讀 2,002評(píng)論 0 7
  • ———————————————回答好下面的足夠了---------------------------------...
    恒愛(ài)DE問(wèn)候閱讀 1,753評(píng)論 0 4
  • GCD (Grand Central Dispatch) :iOS4 開(kāi)始引入,使用更加方便,程序員只需要將任務(wù)添...
    池鵬程閱讀 1,356評(píng)論 0 2