你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發綜合 >> IOS GCD 使用(三)單例模式

IOS GCD 使用(三)單例模式

編輯:IOS開發綜合

一 Dispatch_once函數簡介
使用dispatch_once提價的代碼塊,即便你提交多次,只能執行一次。 void dispatch_once(dispatch_once_t *predicate, dispatch_block_t block); 第一個參數是一個傳出參數用來保存代碼塊在隊列運行時被賦的值,如果你想讓自己的代碼只執行一次的話,你必須指定一個同樣的標識符,其實它是long類型的長整數,即typedef long dispatch_once_t。 第二個參數是一個代碼塊,這個代碼塊沒有參數和返回值。
dispatch_once 中的代碼塊默認的情況下在當前的線程內中執行(也就是被調用函數所在的線程)
二 使用
- (void)viewDidLoad {
[super viewDidLoad]; static dispatch_once_t onceToken;
void (^executedOnlyOnce)(void) = ^(void)
{
static NSUInteger numberOfEntries = 0;
numberOfEntries++;
NSLog(@"Executed %lu time(s) %@", (unsigned long)numberOfEntries,[NSThread currentThread]);
};
dispatch_once(&onceToken, ^(void)
{
dispatch_async(concurrentQueue,executedOnlyOnce);
});
dispatch_once(&onceToken, ^(void)
{
dispatch_async(concurrentQueue,executedOnlyOnce);
});
static dispatch_once_t testToken;
dispatch_once(&testToken, ^(void)
{
NSLog(@"####:Current thread = %@", [NSThread currentThread]);
});

}
輸出結果:
2013-11-11 17:21:21.076 GCDDemo[1410:70b] ####:Current thread = {name = (null), num = 1}
2013-11-11 17:21:21.076 GCDDemo[1410:2a03] Executed 1 time(s) {name = (null), num = 2}

觀察發現:
1.使用了同一個dispatch_once_t標識提價的代碼塊只運行了一次。 2.使用dispatch_once提交的代碼塊默認情況下在當前線程內中執行(也就是被調用函數所在的線程),上面例子在主線程中提交的,所以打印的線程號為1. 3.為了在其他線程中運行dipsatch_once提交的代碼塊,可以將代碼塊的任務提交到GCD隊列中。
三 單例模式
可以利用dispatch_once的性質來實現單例模式,將我們自定義類的對象創建過程封裝到一個代碼塊中,然後以dispath_once的方式來提交。
看代碼:
+(MyClass*) sharedInstance
{
static MyClass *_sharedMyClass;
static dispatch_once_t token;

dispatch_once(&token,^{ _sharedMyClass = [[MyClass alloc] initWith:something];} );

return _sharedMyClass;
}

注意: 1.使用dispatch_once是線程安全的。 2.使用上面例子來實現的單例是“偽單例”,也就是說只有當使用者用MyClass *obj = [MyClass shardInstance];方式來取得對象時候才算是單例,但是我們無法阻止其直接只用alloc來創建自己的對象。

  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved