1.GCD簡介
GCD是蘋果開發的一個多核線程的解決方法,GCD和其它的多線程技術方案想比,使用起來更加簡單和方便.
2.GCD的簡單實現
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ //進行網絡請求數據操作 dispatch_async(dispatch_get_main_queue(), ^{ //回到主線程更新UI }); });
3.系統提供的dispatch方法
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ //you code });
dispatch_async(dispatch_get_main_queue(), ^{ //you code });
static dispatch_once_t pred; dispatch_once(&pred, ^{ //you code });
double delayInSeconds = 2.0; dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC); dispatch_after(popTime, dispatch_get_main_queue(), ^{ //you code });
dispatch_queue_t
也可以自己定義,如要自定義queue
,可以用dispatch_queue_create
方法,示例如下:
dispatch_queue_t urls_queue = dispatch_queue_create("blog.devtang.com", NULL); dispatch_async(urls_queue, ^{ //you code });
dispatch_group_t
丶dispatch_group_async
和dispatch_group_notify
來實現,示例如下:
<code>dispatch_group_t group = dispatch_group_create(); dispatch_group_async(group, dispatch_get_global_queue(0, 0), ^{ //並行執行的線程一 }); dispatch_group_async(group, dispatch_get_global_queue(0, 0), ^{ //並行執行的線程二 }); dispatch_group_notify(group, dispatch_get_global_queue(0, 0), ^{ //匯總結果 });</code>
4.修改block之外的變量
默認情況下,在程序塊中訪問的外部變量是復制過來的,即寫操作不對原變量生效,但是你可以加上__Block來讓其寫操作生效,示例代碼如下:
__block int a = 0; void (^foo)(void) = ^{ a = 1; }; foo(); //這裡,a的值被修改為1
5.後台運行
使用Block的另一個用處是可以讓成勳在後台較長久地運行.在以前,當應用被按Home鍵退出後,應用僅有最多5秒鐘的時間做一些保存或者傾力資源的工作.但是應用可以調用UIApplication
的beginBackgroundTaskWithExpirationHandler
方法,讓應用最多有10分鐘的時間在後台長久運行,這個時間可以用來做清理本地緩存丶發送統計數據等工作.
讓程序在後台長久運行的示例代碼如下:
AppDelegate.h文件
<code>@property (assign , nonatomic) UIBackgroundTaskIdentifier backgroundUpdateTask;</code>
AppDelegate.m文件
-(void)applicationDidEnterBackground:(UIApplication *)application { [self beingBackgroundUpdateTask]; //在這裡加上你需要長久運行的代碼 [self endBackgroundUpdateTask]; } -(void)beingBackgroundUpdateTask { self.backgroundUpdateTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{ [self endBackgroundUpdateTask]; }]; } -(void)endBackgroundUpdateTask { [[UIApplication sharedApplication] endBackgroundTask:self.backgroundUpdateTask]; self.backgroundUpdateTask = UIBackgroundTaskInvalid; }
6.總結
總體來說,GCD能夠極大地方便開發者進行多線程編程,大家應該盡量使用GCD來處理後台線程和UI線程的交互