//
// 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