`
wenxin2009
  • 浏览: 320591 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

GCD多线程

    博客分类:
  • ios
 
阅读更多

        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 (1).zip”表明这是一个关于GCD多线程的示例项目或教程,可能包含了一些演示代码和实践案例。这个压缩包“gcd_demo-master”很可能是一个...

    IOS GCD 多线程

    **iOS GCD 多线程详解** 在iOS开发中,多线程技术是不可或缺的一部分,它使得应用程序可以同时处理多个任务,提升用户体验。GCD(Grand Central Dispatch)是Apple为解决多核处理器环境下并发问题而引入的一个强大...

    GCD 多线程

    GCD 多线程 介绍使用

    iOS GCD 多线程

    ### iOS GCD 多线程知识点详解 #### 一、概览 在iOS开发中,为了提高应用程序的响应性和性能,通常会采用多线程技术。Grand Central Dispatch(简称GCD)是苹果提供的一个高性能的多线程机制,用于简化多线程编程...

    GCD多线程_demo

    GCD(Grand Central Dispatch)是Apple提供的一种强大的多线程解决方案,适用于iOS和Mac OS X系统。本教程通过"GCDDemo"项目,将详细介绍如何利用GCD进行iOS多线程编程,并展示其与Block的结合使用,以提升代码的...

    学习iOS锁、GCD多线程的一个售票系统.zip

    网络与通信:数据传输、信号处理、网络协议、网络与通信硬件、网络安全网络与通信是一个非常广泛的领域,它涉及到计算机科学、电子工程、数学等多个学科的知识。 云计算与大数据:数据集、包括云计算平台、大数据...

    IOS多线程GCD

    本资源包含了一份关于iOS GCD多线程的代码示例,旨在帮助开发者深入理解和熟练掌握这一技术。 1. **GCD基本概念** - **队列(Queue)**:GCD使用队列来管理任务,分为串行队列和并行队列。串行队列一次只执行一个...

    iOS多线程GCD和线程锁的使用

    iOS多线程编程之Grand Central Dispatch(GCD)使用,卖票的例子来讲NSThread的线程同步,使用了两种锁,一种NSCondition ,一种是:NSLock,还有加了一个 线程3 去唤醒其他两个线程锁中的wait,里面的注释很已经写的...

    多线程GCD- Demo

    在iOS和macOS开发中,Grand Central Dispatch (GCD) 是一种强大的多线程技术,由Apple提供,用于处理并发任务。GCD是基于C语言的API,但在Objective-C和Swift中同样适用。标题"多线程GCD - Demo"表明我们将探讨如何...

    iOS多线程-GCD(异步任务,线程锁)

    GCD(Grand Central Dispatch)是苹果推出的一种强大的多线程解决方案,它为开发者提供了简单而高效的方式来管理并发任务。本文将深入探讨GCD中的异步任务、线程锁以及如何在iOS中实现它们。 首先,我们要理解什么...

    iOS 多线程总结之GCD的使用详解

    ### iOS多线程与GCD概述 在iOS开发中,多线程是一个非常重要的概念。通过多线程,我们可以利用多核处理器的优势,将不同任务分散到多个线程中执行,从而提高程序的响应速度和执行效率。GCD(Grand Central Dispatch...

    OC-GCD异步线程下载图片

    GCD(Grand Central Dispatch)是Apple引入的一个强大的多线程管理工具,它简化了并发编程,使得异步操作变得更加容易。本篇将深入探讨如何使用Objective-C(简称OC)和GCD来实现异步下载图片。 首先,理解GCD的...

    iOS中GCD在多线程方面的理解

    在iOS开发中,Grand Central Dispatch(GCD)是苹果公司提供的一个强大的多线程解决方案,它可以帮助开发者有效地管理和调度并发任务。GCD是基于C语言的API,但在Objective-C和Swift中同样适用,通过简化多核处理器...

    多线程GCD,NSThread,NSOperationQueue,详细解释Demo

    本篇文章将深入探讨GCD (Grand Central Dispatch)、NSThread和NSOperationQueue这三种主要的多线程实现方式,并通过具体示例进行详细解释。 **一、GCD(Grand Central Dispatch)** GCD是Apple开发的一种多线程...

    iOS 多线程编程指南 pdf

    iOS多线程编程指南是一份深入介绍iOS平台下多线程编程技术的文档。文档主要涵盖的技术点包括NSThread、NSOperation以及Grand Central Dispatch(GCD),这些技术是iOS开发者在开发应用程序时常用的技术。 首先,...

    iOS多线程Demo

    总之,“iOS多线程Demo”是一个很好的学习资源,它涵盖了iOS多线程开发的基础和实践,包括NSOperationQueue、GCD和NSThread的使用,以及多线程下的UI更新和线程安全。通过这个Demo,开发者可以更深入地理解多线程...

    多线程编程指南

    多线程编程是一种让多个代码路径在同一个程序中同时运行的技术,它允许多个执行流(线程)并发执行。在iOS开发中,多线程编程可以帮助开发者充分利用多核处理器的性能,提高应用程序的响应性和运行效率。然而,多...

    ios多线程开发的常用四种方式和基本使用

    本文将深入探讨四种常用的iOS多线程开发方式:pthread、NSThread、NSOperation及NSOperationQueue,以及Grand Central Dispatch(GCD)。 首先,让我们了解下pthread。pthread是POSIX线程库,它在iOS中被用于跨平台...

Global site tag (gtag.js) - Google Analytics