//
// MainViewController.m
// GCD
//
// Created by hejin on 13-12-29.
// Copyright (c) 2013年 e世雕龙. All rights reserved.
//
#import "MainViewController.h"
@interface MainViewController ()
@property (strong, nonatomic) IBOutlet UIProgressView *myProgress;//进度条
@property (strong, nonatomic) IBOutlet UITextView *textView;//多行文本框
@end
@implementation MainViewController
//GCD方式更新进度条
- (IBAction)updateProgress:(id)sender {
dispatch_async(dispatch_get_global_queue(0, 0), ^{
for (int i=0; i<100; i++) {
[NSThread sleepForTimeInterval:0.02];
dispatch_async(dispatch_get_main_queue(), ^{
self.myProgress.progress += 0.01;
});
}
});
}
//GCD并发多线程完成任务
- (IBAction)asynDowork:(id)sender {
self.textView.text = @"";
NSMutableString *strWork = [NSMutableString stringWithCapacity:20];
//不使用多线程
/*[strWork appendFormat:@"%@\n",[self doWork1]];
[strWork appendFormat:@"%@\n",[self doWork2]];
[strWork appendFormat:@"%@\n",[self doWork3]];
self.textView.text = strWork;*/
//获取已经存在并始终可用的全局队列
dispatch_queue_t globalQueue = dispatch_get_global_queue(0, 0);
//获取主线程队列
dispatch_queue_t mainQueue = dispatch_get_main_queue();
//并发多线程完成任务
dispatch_async(globalQueue, ^{
[strWork appendFormat:@"%@\n",[self doWork1]];
NSLog(@"doWork1");
dispatch_async(mainQueue, ^{
self.textView.text = strWork;
NSLog(@"updateUI");
});
});
dispatch_async(globalQueue, ^{
[strWork appendFormat:@"%@\n",[self doWork2]];
NSLog(@"doWork2");
dispatch_async(mainQueue, ^{
self.textView.text = strWork;
NSLog(@"updateUI");
});
});
dispatch_async(globalQueue, ^{
[strWork appendFormat:@"%@\n",[self doWork3]];
NSLog(@"doWork3");
dispatch_async(mainQueue, ^{
self.textView.text = strWork;
NSLog(@"updateUI");
});
});
}
//GCD同步完成任务
- (IBAction)synDowork:(id)sender {
self.textView.text = @"";
NSMutableString *strWork = [NSMutableString stringWithCapacity:20];
//获取已经存在并始终可用的全局队列
dispatch_queue_t globalQueue = dispatch_get_global_queue(0, 0);
//获取主线程队列
dispatch_queue_t mainQueue = dispatch_get_main_queue();
//同步完成任务
dispatch_sync(globalQueue, ^{
[strWork appendFormat:@"%@\n",[self doWork1]];
NSLog(@"doWork1");
});
dispatch_sync(globalQueue, ^{
[strWork appendFormat:@"%@\n",[self doWork2]];
NSLog(@"doWork2");
});
dispatch_sync(globalQueue, ^{
[strWork appendFormat:@"%@\n",[self doWork3]];
NSLog(@"doWork3");
});
//在主线程中更新UI,如下代码同步等待主线程中按钮点击事件完成才进行,主线程中按钮点击事件等待如下代码完成,造成阻塞
/*dispatch_sync(globalQueue, ^{
dispatch_sync(mainQueue, ^{
self.textView.text = strWork;
});
});*/
dispatch_async(globalQueue, ^{
dispatch_async(mainQueue, ^{
self.textView.text = strWork;
});
});
}
//使用GCD推荐的分组派发同步完成任务
- (IBAction)groupSynDowork:(id)sender {
self.textView.text = @"";
NSMutableString *strWork = [NSMutableString stringWithCapacity:20];
//创建组和队列
dispatch_group_t group = dispatch_group_create();
dispatch_queue_t globalQueue = dispatch_get_global_queue(0, 0);
//队列在组中执行操作
dispatch_group_async(group, globalQueue, ^{
[strWork appendFormat:@"%@\n",[self doWork1]];
NSLog(@"doWork1");
});
dispatch_group_async(group, globalQueue, ^{
[strWork appendFormat:@"%@\n",[self doWork2]];
NSLog(@"doWork2");
});
dispatch_group_async(group, globalQueue, ^{
[strWork appendFormat:@"%@\n",[self doWork3]];
NSLog(@"doWork3");
});
//通知组中任务完成在主线程中更新UI
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
self.textView.text = strWork;
});
}
//任务1
- (NSString *)doWork1 {
[NSThread sleepForTimeInterval:2];
return @"任务1完成!";
}
//任务2
- (NSString *)doWork2 {
[NSThread sleepForTimeInterval:3];
return @"任务2完成!";
}
//任务3
- (NSString *)doWork3 {
[NSThread sleepForTimeInterval:4];
return @"任务3完成!";
}
@end
ios GCD
最新推荐文章于 2024-03-26 18:43:22 发布