Grand Central Dispatch可以简化多线程编程。可以将应用程序需要执行的工作拆分为可分散在多个线程和多个cpu上更小的块。多线程还是得了解底层的实现,GCD只是进行了封装。
以下为实例:
#import <UIKit/UIKit.h> @interface ViewController : UIViewController - (IBAction)doWork:(id)sender; @property (weak, nonatomic) IBOutlet UITextView *resultsTextView; @property (weak, nonatomic) IBOutlet UIButton *startButton; @property (weak, nonatomic) IBOutlet UIActivityIndicatorView *spinner; @end
// // ViewController.m // Study20130220 // // Created by Dwen on 13-2-20. // Copyright (c) 2013年 Dwen. All rights reserved. // #import "ViewController.h" @interface ViewController () @end @implementation ViewController @synthesize startButton,resultsTextView,spinner; - (void)viewDidLoad { [super viewDidLoad]; NSLog(@"load view..."); // //定义程序块 // void(^loggerBlock)(void); // //实现程序块 // loggerBlock = ^{NSLog(@"i am test block.");}; // //执行程序块 // loggerBlock(); } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } - (NSString *)fetchSomethingFromServer{ [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 { //并发程序块 startButton.enabled = NO; startButton.alpha = 0.5; [spinner startAnimating]; NSDate *startTime = [NSDate date]; dispatch_async(dispatch_get_global_queue(0, 0), ^{ NSString *fetchedData = [self fetchSomethingFromServer]; NSString *processData = [self processData:fetchedData]; __block NSString *firstResult; __block NSString *secondResult; dispatch_group_t group = dispatch_group_create(); dispatch_group_async(group, dispatch_get_global_queue(0, 0), ^{ NSLog(@"calculateFirstResult..."); firstResult = [self calculateFirstResult:processData]; }); dispatch_group_async(group, dispatch_get_global_queue(0, 0), ^{ NSLog(@"calculateSecondResult..."); secondResult = [self calculateSecondResult:processData]; }); //dispatch_group_notify指定一个额外的程序块,该程序块将在组中的所有程序块运行完成时执行 dispatch_group_notify(group, dispatch_get_global_queue(0, 0), ^{ NSString *resultsSummary = [NSString stringWithFormat:@"First: [%@]\nSecond: [%@]",firstResult,secondResult]; NSLog(@"resultsSummary :%@",resultsSummary); //dispatch_get_main_queue主线程 dispatch_async(dispatch_get_main_queue(), ^{ NSLog(@"change value."); startButton.enabled = YES; startButton.alpha = 1.0; [spinner stopAnimating]; resultsTextView.text = resultsSummary; }); NSDate *endTime = [NSDate date]; NSLog(@"Completed in %f seconds",[endTime timeIntervalSinceDate:startTime]); }); }); //异步执行 // startButton.enabled = NO; // startButton.alpha = 0.5; // [spinner startAnimating]; // NSDate *startTime = [NSDate date]; // dispatch_async(dispatch_get_global_queue(0, 0), ^{ // NSString *fetchedData = [self fetchSomethingFromServer]; // NSString *processData = [self processData:fetchedData]; // NSString *firstResult = [self calculateFirstResult:processData]; // NSString *secondResult = [self calculateSecondResult:processData]; // NSString *resultsSummary = [NSString stringWithFormat:@"First: [%@]\nSecond: [%@]",firstResult,secondResult]; // NSLog(@"resultsSummary :%@",resultsSummary); // dispatch_async(dispatch_get_main_queue(), ^{ // NSLog(@"change value."); // startButton.enabled = YES; // startButton.alpha = 1.0; // [spinner stopAnimating]; // resultsTextView.text = resultsSummary; // }); // NSDate *endTime = [NSDate date]; // NSLog(@"Completed in %f seconds",[endTime timeIntervalSinceDate:startTime]); // }); //同步执行 // NSDate *startTime = [NSDate date]; // NSString *fetchedData = [self fetchSomethingFromServer]; // NSString *processData = [self processData:fetchedData]; // NSString *firstResult = [self calculateFirstResult:processData]; // NSString *secondResult = [self calculateSecondResult:processData]; // NSString *resultsSummary = [NSString stringWithFormat:@"First: [%@]\nSecond: [%@]",firstResult,secondResult]; // resultsTextView.text = resultsSummary; // NSDate *endTime = [NSDate date]; // NSLog(@"Completed in %f seconds",[endTime timeIntervalSinceDate:startTime]); } @end
异步执行需花10秒,而并发程序块只花了7秒,大大提高了效率。在真实的应用程序中,加速程度将取决于所执行的工作和可用的资源。只有在多个cpu核心可用时,执行cpu资源密集型的计算才能受益于此技术。
=================================================================================
NSThread和GCD是多线程的两种实现方式,NSThread实现起来比GCD稍微复杂些,GCD要比较简单些,GCD是C语言提供的API。GCD支持多核CPU处理。
在GCD中,有3种类型的派发队列:
1、串行队列。串行队列通常用于同步访问一个特定的资源,每次只能执行一个任务。使用函数dispatch_queue_create,可以创建串行队列。
2、并发队列。也叫全局派发队列,可以并发地执行一个或多个任务。并发队列分为高、中、低3个优先级队列,中级为默认级别。可以使用调用dispatch_get_global_queue函数设定优先级来访问队列。
3、主队列。它在应用程序的主线程中,用于更新UI。使用dispatch_get_main_queue函数,可以获得主队列。
以下两种图片下载方式,效率完全不一样。
同步下载图片:
NSString *picPath = [NSString stringWithFormat:@"%@?imageView2/0/w/%d",_mdExhibitVo.exhibitPic,(int)(([UIScreen mainScreen].bounds.size.width-8*2)*2)]; picPath = [picPath stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; NSData * picData = [NSData dataWithContentsOfURL:[NSURL URLWithString:picPath]]; self.imageView.image = [UIImage imageWithData:picData]];
异步下载图片:
NSString *smallImgStr = [NSString stringWithFormat:@"%@?imageView/0/w/200/q/20",_mdExhibitWorkVo.worksPic]; smallImgStr = [smallImgStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; dispatch_queue_t downloadQueue = dispatch_queue_create("com.test.works.image", NULL); dispatch_async(downloadQueue, ^{ NSData *imgData = [NSData dataWithContentsOfURL:[NSURL URLWithString:smallImgStr]]; UIImage *img = [UIImage imageWithData:imgData]; dispatch_async(dispatch_get_main_queue(), ^{ _headerImageView.image = img; [[ImageProgressView sharedASIImageViewAppearance] setPlaceholderImage:img]; }); });
相关推荐
标题“gcd多线程gcd-demo-master (1).zip”和描述“gcd多线程gcd_demo-master (1).zip”表明这是一个关于GCD多线程的示例项目或教程,可能包含了一些演示代码和实践案例。这个压缩包“gcd_demo-master”很可能是一个...
**iOS GCD 多线程详解** 在iOS开发中,多线程技术是不可或缺的一部分,它使得应用程序可以同时处理多个任务,提升用户体验。GCD(Grand Central Dispatch)是Apple为解决多核处理器环境下并发问题而引入的一个强大...
GCD 多线程 介绍使用
### iOS GCD 多线程知识点详解 #### 一、概览 在iOS开发中,为了提高应用程序的响应性和性能,通常会采用多线程技术。Grand Central Dispatch(简称GCD)是苹果提供的一个高性能的多线程机制,用于简化多线程编程...
GCD(Grand Central Dispatch)是Apple提供的一种强大的多线程解决方案,适用于iOS和Mac OS X系统。本教程通过"GCDDemo"项目,将详细介绍如何利用GCD进行iOS多线程编程,并展示其与Block的结合使用,以提升代码的...
网络与通信:数据传输、信号处理、网络协议、网络与通信硬件、网络安全网络与通信是一个非常广泛的领域,它涉及到计算机科学、电子工程、数学等多个学科的知识。 云计算与大数据:数据集、包括云计算平台、大数据...
本资源包含了一份关于iOS GCD多线程的代码示例,旨在帮助开发者深入理解和熟练掌握这一技术。 1. **GCD基本概念** - **队列(Queue)**:GCD使用队列来管理任务,分为串行队列和并行队列。串行队列一次只执行一个...
iOS多线程编程之Grand Central Dispatch(GCD)使用,卖票的例子来讲NSThread的线程同步,使用了两种锁,一种NSCondition ,一种是:NSLock,还有加了一个 线程3 去唤醒其他两个线程锁中的wait,里面的注释很已经写的...
在iOS和macOS开发中,Grand Central Dispatch (GCD) 是一种强大的多线程技术,由Apple提供,用于处理并发任务。GCD是基于C语言的API,但在Objective-C和Swift中同样适用。标题"多线程GCD - Demo"表明我们将探讨如何...
GCD(Grand Central Dispatch)是苹果推出的一种强大的多线程解决方案,它为开发者提供了简单而高效的方式来管理并发任务。本文将深入探讨GCD中的异步任务、线程锁以及如何在iOS中实现它们。 首先,我们要理解什么...
### iOS多线程与GCD概述 在iOS开发中,多线程是一个非常重要的概念。通过多线程,我们可以利用多核处理器的优势,将不同任务分散到多个线程中执行,从而提高程序的响应速度和执行效率。GCD(Grand Central Dispatch...
GCD(Grand Central Dispatch)是Apple引入的一个强大的多线程管理工具,它简化了并发编程,使得异步操作变得更加容易。本篇将深入探讨如何使用Objective-C(简称OC)和GCD来实现异步下载图片。 首先,理解GCD的...
在iOS开发中,Grand Central Dispatch(GCD)是苹果公司提供的一个强大的多线程解决方案,它可以帮助开发者有效地管理和调度并发任务。GCD是基于C语言的API,但在Objective-C和Swift中同样适用,通过简化多核处理器...
本篇文章将深入探讨GCD (Grand Central Dispatch)、NSThread和NSOperationQueue这三种主要的多线程实现方式,并通过具体示例进行详细解释。 **一、GCD(Grand Central Dispatch)** GCD是Apple开发的一种多线程...
iOS多线程编程指南是一份深入介绍iOS平台下多线程编程技术的文档。文档主要涵盖的技术点包括NSThread、NSOperation以及Grand Central Dispatch(GCD),这些技术是iOS开发者在开发应用程序时常用的技术。 首先,...
总之,“iOS多线程Demo”是一个很好的学习资源,它涵盖了iOS多线程开发的基础和实践,包括NSOperationQueue、GCD和NSThread的使用,以及多线程下的UI更新和线程安全。通过这个Demo,开发者可以更深入地理解多线程...
多线程编程是一种让多个代码路径在同一个程序中同时运行的技术,它允许多个执行流(线程)并发执行。在iOS开发中,多线程编程可以帮助开发者充分利用多核处理器的性能,提高应用程序的响应性和运行效率。然而,多...
本文将深入探讨四种常用的iOS多线程开发方式:pthread、NSThread、NSOperation及NSOperationQueue,以及Grand Central Dispatch(GCD)。 首先,让我们了解下pthread。pthread是POSIX线程库,它在iOS中被用于跨平台...