您好,登錄后才能下訂單哦!
GCD (Grand Central Dispatch)
GCD: 將應用程序需要執行的工作拆分為可分散在多個線程和多個CPU 上更小的塊
demo 效果圖:
1—— .h 文件
- #import <UIKit/UIKit.h>
- @interface ViewController : UIViewController
- - (IBAction)doWork:(id)sender;
- @property (retain, nonatomic) IBOutlet UIButton *StartBtn;
- @property (retain, nonatomic) IBOutlet UITextView *resultTextView;
- @property (retain, nonatomic) IBOutlet UIActivityIndicatorView *spinner;
- @end
2— .m 文件
- #import "ViewController.h"
- @implementation ViewController
- @synthesize StartBtn;
- @synthesize resultTextView;
- @synthesize spinner;
- - (NSString *)fetchSomethingFromServer
- {
- //將應用程序鎖定 1 秒
- [NSThread sleepForTimeInterval:1];
- return @"hi there";
- }
- - (NSString *)processData:(NSString *)data
- {
- [NSThread sleepForTimeInterval:2];
- return [data uppercaseString];
- }
- - (NSString *)calculateFirstResult:(NSString *)data
- {
- [NSThread sleepForTimeInterval:3];
- return [NSString stringWithFormat:@"number of chars :%d",[data length]];
- }
- - (NSString *)calculateSecondResult:(NSString *)data
- {
- [NSThread sleepForTimeInterval:4];
- return [data stringByReplacingOccurrencesOfString:@"E" withString:@"e"];
- }
- - (IBAction)doWork:(id)sender{
- StartBtn.enabled = NO;
- StartBtn.alpha = 0.5;
- [spinner startAnimating];
- NSDate *startTime = [NSDate date];
- // dispatch_get_global_queue(dispatch_queue_priority_t priority, unsigned long flags)
- // dispatch_get_global_queue() 抓取一個已經存在并且始終可用的全局隊列 該函數接收倆個參數:
- // 1_用于指定優先級(傳入0表示使用默認的優先級) ,2_目前未使用并且始終為0()
- dispatch_async(dispatch_get_global_queue(0, 0), ^{
- NSString *fetchedData = [self fetchSomethingFromServer];
- NSString *processedData = [self processData:fetchedData];
- // NSString *firstResult = [self calculateFirstResult:processedData];
- // NSString *secondResult = [self calculateSecondResult:processedData];
- //calculateFirstResult && calculateSecondResult 不需要順序執行 ,并發的執行他們可以更顯著的提高速度。
- // GCD 提供一種途徑來完成此任務,使用所謂的“分派組”,將一個組上 的 上下文中通過 dispatch_group_async() 函數異步分派的所有程序塊設置為松散的,以盡可能快的執行,如果可能,將它們分發給多個線程來執行。
- // 也可以使用dispathch_group_notify() 指定一個 額外的程序塊,該程序塊將在組中的所有程序塊即將運行完成時執行。
- __block NSString *firstResult;
- __block NSString *secondResult;
- dispatch_group_t group = dispatch_group_create();
- dispatch_group_async(group, dispatch_get_global_queue(0, 0), ^{
- firstResult = [[self calculateFirstResult:processedData]retain];
- });
- dispatch_group_async(group, dispatch_get_global_queue(0, 0), ^{
- secondResult = [[self calculateSecondResult:processedData]retain];
- });
- // 使用dispathch_group_notify() 指定一個 額外的程序塊,該程序塊將在組中的所有程序塊即將運行完成時執行。
- dispatch_group_notify(group, dispatch_get_global_queue(0, 0), ^{
- NSString *resultsSummary = [NSString stringWithFormat:@"first :[%@] \n second: [%@] \n",firstResult,secondResult];
- // resultTextView.text = resultsSummary;
- //在后臺線程聯系任何GUI對象是不可能的,必須將工作傳回到主線程!可再次調用dispatch_async 這次傳入dispatch_get_main_queue() 函數返回的隊列,該函數總是 提供存在于主線程上的特殊隊列,并準備執行需要使用主線程的程序塊
- dispatch_async(dispatch_get_main_queue(), ^{
- // 回到主線程才可以出發按鈕事件
- StartBtn.enabled = YES;
- StartBtn.alpha = 1.0;
- [spinner stopAnimating];
- resultTextView.text = resultsSummary;
- });
- NSDate *endTime = [NSDate date];
- NSLog(@"complete in %f seconds",[endTime timeIntervalSinceDate:startTime]);
- // 在最后一個程序塊中釋放 它們,
- [firstResult release];
- [secondResult release];
- });
- }) ;
- }
- #pragma mark - View lifecycle
- - (void)viewDidLoad
- {
- [super viewDidLoad];
- // Do any additional setup after loading the view, typically from a nib.
- }
- - (void)viewDidUnload
- {
- [self setStartBtn:nil];
- [self setResultTextView:nil];
- [self setSpinner:nil];
- [super viewDidUnload];
- // Release any retained subviews of the main view.
- // e.g. self.myOutlet = nil;
- }
- - (void)dealloc {
- [StartBtn release];
- [resultTextView release];
- [spinner release];
- [super dealloc];
- }
- @end
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。