您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
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进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。