iOS GCD淺談
阿新 • • 發佈:2019-01-06
我們還可以使用更好的方法來完成這件事——使用更“非同步”的風格。不同於取介面層的值時要阻塞後臺執行緒,你可以使用巢狀的block來中止後臺執行緒,然後從主執行緒中獲取值,然後再將後期處理提交至後臺執行緒:
- dispatch_queue_t bgQueue = myQueue;
- dispatch_async(dispatch_get_main_queue(), ^{
- NSString *stringValue = [[[textField stringValue] copy] autorelease];
- dispatch_async(bgQueue, ^{
- // use stringValue in the background now
- });
- });
取決於你的需求,myQueue可以是使用者佇列也可以使全域性佇列。
不再使用鎖(Lock)
使用者佇列可以用於替代鎖來完成同步機制。在傳統多執行緒程式設計中,你可能有一個物件要被多個執行緒使用,你需要一個鎖來保護這個物件:
- NSLock *lock;
訪問程式碼會像這樣:
- - (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來替代:
- dispatch_queue_t queue;
要用於同步機制,queue必須是一個使用者佇列,而非全域性佇列,所以使用usingdispatch_queue_create初始化一個。然後可以用dispatch_async 或者 dispatch_sync將共享資料的訪問程式碼封裝起來:
- - (id)something
- {
- __block id localSomething;
- dispatch_sync(queue, ^{
- localSomething = [something retain];
- });
- return [localSomething autorelease];
- }
- - (void)setSomething:(id)newSomething
- {
- dispatch_async(queue, ^{
- if(newSomething != something)
- {
- [something release];
- something = [newSomething retain];
- [self updateSomethingCaches];
- }
- });
- }