// // ViewController.m // Begin iOS7 GCD // // Created by zyz on 15-4-1. // Copyright (c) 2015年 Apple. All rights reserved. // #import "ViewController.h" @interface ViewController () //storyboard三个控件 @property (weak, nonatomic) IBOutlet UIButton *startButton; @property (weak, nonatomic) IBOutlet UILabel *resultTextView; @property (weak, nonatomic) IBOutlet UIActivityIndicatorView *spinner; @end @implementation ViewController - (NSString *)fetchSomethingFromServer{ [NSThread sleepForTimeInterval:1]; return @"Hi, Here"; } - (NSString *)processData:(NSString *)data{ [NSThread sleepForTimeInterval:2]; return [data uppercaseString]; } - (NSString *)calculateFirstResult:(NSString *)data{ [NSThread sleepForTimeInterval:3]; return [NSString stringWithFormat:@"Number of chars: %lu", (unsigned long)[data length]]; } - (NSString *)calculateSecondResult:(NSString *)data{ [NSThread sleepForTimeInterval:4]; return [data stringByReplacingOccurrencesOfString:@"E" withString:@"e"]; } //点击事件 - (IBAction)buttonClick:(id)sender { self.startButton.enabled = NO; [self.spinner setHidden:NO]; [self.spinner startAnimating]; dispatch_queue_t queue1 = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); dispatch_async(queue1, ^{ NSLog(@"queue1 Thread is %@",[NSThread currentThread]); NSDate *startTime = [NSDate date]; NSString *fetchedDate = [self fetchSomethingFromServer]; NSString *processDate = [self processData:fetchedDate]; NSString *firstResult = [self calculateFirstResult:processDate]; NSString *secondResult = [self calculateSecondResult:processDate]; dispatch_queue_t queue2 = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); dispatch_queue_t queue3 = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); //注意字符串只定义,不会为字符串分配空间,追加字符串会失败,这里定义为空的正确方式 __block NSString *resultsSummary = [NSString stringWithFormat:@""]; //异步加载,可能还没有执行完成就执行主线程的异步加载 dispatch_async(queue2, ^{ resultsSummary = [NSString stringWithFormat:@"First:[%@]\n",firstResult]; NSLog(@"queue2 Thread is %@",[NSThread currentThread]); }); dispatch_async(queue3, ^{ resultsSummary = [resultsSummary stringByAppendingString:[NSString stringWithFormat:@"Second:[%@]",secondResult]]; NSLog(@"queue3 Thread is %@",[NSThread currentThread]); }); dispatch_async(dispatch_get_main_queue(), ^{ //这里字符串仍然为空,因为异步加载执行的语句还没有完成就到了这里 resultsSummary = [resultsSummary stringByAppendingString:@"1111"]; //label的内容是1111,或者是其他的可能结果 self.resultTextView.text = resultsSummary; self.resultTextView.backgroundColor = [UIColor brownColor]; [self.spinner stopAnimating]; [self.spinner setHidden:YES]; }); NSDate *endTime = [NSDate date]; NSLog(@"Completed in %f seconds",[endTime timeIntervalSinceDate:startTime]); }); } - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. [self.spinner setHidden:YES]; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } @end
时间: 2024-10-12 20:29:26