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來創建自己的對象。
- 上一頁:ios中json object轉換成字符串
- 下一頁:iOS 通知機制 Notifications (一)
Copyright ©
Ios教程網 All Rights Reserved