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

GCD为Grand Central Dispatch的缩写。  Grand Central Dispatch (GCD)是Apple开发的一个多核编程的较新的解决方法。在Mac OS X 10.6雪豹中首次推出,并在最近引入到了iOS4.0。  GCD是一个替代诸如NSThread等技术的很高效和强大的技术。GCD完全可以处理诸如数据锁定和资源泄漏等复杂的异步编程问题。 

 GCD可以完成很多事情,但是这里仅关注在iOS应用中实现多线程所需的一些基础知识。  在开始之前,需要理解是要提供给GCD队列的是代码块,用于在系统或者用户创建的的队列上调度运行。  声明一个队列   

如下会返回一个用户创建的队列:

  dispatch_queue_t myQueue = dispatch_queue_create("com.iphonedevblog.post", NULL);其中,第一个参数是标识队列的,第二个参数是用来定义队列的参数(目前不支持,因此传入NULL)。 

执行一个队列  

 如下会异步执行传入的代码: 

 dispatch_async(myQueue, ^{ [self doSomething]; });其中,首先传入之前创建的队列,然后提供由队列运行的代码块。  

声明并执行一个队列   

如果不需要保留要运行的队列的引用,可以通过如下代码实现之前的功能:  dispatch_async(dispatch_queue_create ("com.iphonedevblog.post", NULL), ^{ [self doSomething]; });  如果需要暂停一个队列,可以调用如下代码。暂停一个队列会阻止和该队列相关的所有代码运行。  dispatch_suspend(myQueue);暂停一个队列  

如果暂停一个队列不要忘记恢复。暂停和恢复的操作和内存管理中的retain和release类似。调用dispatch_suspend会增加暂停计数,而dispatch_resume则会减少。队列只有在暂停计数变成零的情况下才开始运行。dispatch_resume(myQueue);恢复一个队列    从队列中在主线程运行代码   有些操作无法在异步队列运行,因此必须在主线程(每个应用都有一个)上运行。UI绘图以及任何对NSNotificationCenter的调用必须在主线程长进行。在另一个队列中访问主线程并运行代码的示例如下:  dispatch_sync(dispatch_get_main_queue(), ^{ [self dismissLoginWindow]; });注意,dispatch_suspend (以及dispatch_resume)在主线程上不起作用。

使用GCD,可以让你的程序不会失去响应. 多线程不容易使用,用了GCD,会让它变得简单。你无需专门进行线程管理, 很棒!

让你的程序保持响应的原则:

1. 不要柱塞主线程

2. 把工作一到其他线程中做。

3. 做完后更新主线程的UI.

举例说明:

没有GCD的代码:

- (void)addTweetWithMsg:(NSString*)msg url:(NSURL*)url {

// 在主线程调用。

DTweet *tw = [[DTweet alloc] initWithMsg:msg];

[tweets addTweet:tw display:YES];

tw.img = [imageCache getImgFromURL:url];//bottle neck

[tweets updateTweet:tw display:YES];

[tw release];

}

有GCD的代码:

- (void)addTweetWithMsg:(NSString*)msg url:(NSURL*)url {

//在主线程调用。

DTweet *tw = [[DTweet alloc] initWithMsg:msg];

[tweets addTweet:tw display:YES];

dispatch_async(image_queue, ^{

tw.img = [imageCache getImgFromURL:url];//放到一个异步队列里。

dispatch_async(main_queue, ^{

[tweets updateTweet:tw display:YES];//放到异步的主线程里。

});

});

[tw release];

}

1. GCD is part of libSystem.dylib

2. #include <dispatch/dispatch.h>

一》NSThread的方法:代码如下:

- (void)viewDidLoad

{

[super viewDidLoad];

NSThread *thread1=[[NSThread alloc]initWithTarget:self selector:@selector(print1) object:nil];

[thread1 start];

NSThread *thread2=[[NSThread alloc]initWithTarget:self selector:@selector(print2) object:nil];

[thread2 start];

}

-(void)print1{

for (int i=0; i<100; i++) {

NSLog(@"我是print1正在执行%d",i);

}

}

-(void)print2{

for (int i=0; i<100; i++) {

NSLog(@"print2正在执行%d",i);

}

}

二》

NSInvocationOperation

的方法:代码如下

//    NSInvocationOperation *operation1=[[NSInvocationOperation alloc]initWithTarget:self selector:@selector(print1) object:@"1"];

//    NSInvocationOperation *operation2=[[NSInvocationOperation alloc]initWithTarget:self selector:@selector(print2) object:@"2"];//当然这里可以用一个方法。

//    NSOperationQueue *queue=[[NSOperationQueue alloc]init];

//    [queue addOperation:operation1];

//    [queue addOperation:operation2];

三》

GCD

的方法:代码如下

dispatch_queue_t t1=dispatch_queue_create("1", NULL);

dispatch_queue_t t2=dispatch_queue_create("2", NULL);

dispatch_async(t1, ^{

[self print1];

});

dispatch_async(t2, ^{

[self print2];

});

http://www.cnblogs.com/pengyingh/articles/2356825.html

http://www.cnblogs.com/vinceoniphone/archive/2011/04/07/2007968.html //详解地址。

http://blog.csdn.net/zhuqilin0/article/details/6527113    //消息推送机制

Push的原理:

Push 的工作机制可以简单的概括为下图

图中,Provider是指某个iPhone软件的Push服务器,这篇文章我将使用.net作为Provider。  APNS 是Apple Push Notification Service(Apple Push服务器)的缩写,是苹果的服务器。

上图可以分为三个阶段。

第一阶段:.net应用程序把要发送的消息、目的iPhone的标识打包,发给APNS。  第二阶段:APNS在自身的已注册Push服务的iPhone列表中,查找有相应标识的iPhone,并把消息发到iPhone。  第三阶段:iPhone把发来的消息传递给相应的应用程序, 并且按照设定弹出Push通知。

http://blog.csdn.net/zhuqilin0/article/details/6527113    //消息推送机制

看内存泄露时候:在搜索中搜索run 找到Run Static Snalyzer .

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

时间: 2024-10-07 07:13:15

iOS开发中GCD在多线程方面的理解的相关文章

iOS开发中的gcd多线程tips

iOS开发中的gcd多线程tips 我们经常用到的: dispatch_async(dispatch_get_global_queue(0, 0), ^{ // 处理耗时操作的代码块 //通知主线程刷新 dispatch_async(dispatch_get_main_queue(), ^{ //回调或者说是通知主线程刷新 }); }); 其中main_queue是系统默认的串行队列,global_queue是系统默认的并行队列. 什么是串行队列(Serial)? 创建任意个数的串行队列,每个队

ios开发中 线程、进程即多线程简单介绍

本文转自:原文http://www.cnblogs.com/wendingding/p/3805088.html 一.进程和线程 1.什么是进程 进程是指在系统中正在运行的一个应用程序 每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内 比如同时打开QQ.Xcode,系统就会分别启动2个进程 通过“活动监视器”可以查看Mac系统中所开启的进程 2.什么是线程 1个进程要想执行任务,必须得有线程(每1个进程至少要有1条线程) 线程是进程的基本执行单元,一个进程(程序)的所有任务都在线

iOS开发——实用技术OC篇&amp;多线程整合

多线程整合 本文知识对iOS开发中多线程的一些知识整合,关于一些概念和技术问题并没有过多的介绍,如果你想了解更多请查看笔者之前写的iOS开发之多线程详解(比较完整):但是有部分涉及到之前文章中没有的技术点和常识,比如加锁的方式,面试相关的,还有一些关于GCD的高级用法,希望你能认真看完,或许可以收获到很多! http://www.cnblogs.com/iCocos/p/4553103.html http://www.cnblogs.com/iCocos/p/4553262.html ??先来看

iOS开发之再探多线程编程:Grand Central Dispatch详解

之前关于iOS开发多线程的内容发布过一篇博客,其中介绍了NSThread.操作队列以及GCD,介绍的不够深入.今天就以GCD为主题来全面的总结一下GCD的使用方式.GCD的历史以及好处在此就不做过多的赘述了.本篇博客会通过一系列的实例来好好的总结一下GCD.GCD在iOS开发中还是比较重要的,使用场景也是非常多的,处理一些比较耗时的任务时基本上都会使用到GCD, 在使用是我们也要主要一些线程安全也死锁的东西. 本篇博客中对iOS中的GCD技术进行了较为全面的总结,下方模拟器的截图就是我们今天要介

iOS开发中遇到过的坑

iOS开发中遇到过的坑 前言 做iOS开发这么长时间以来,遇到过不少难题,也踩过不少坑,本来没想过要写这篇文章,但是鉴于以下三点,笔者决定对遇到过的并且还能回忆起来的问题做个记录. 每次问题解决后,满满的成就感,但是当下一次再遇到时,又是一脸懵逼.这个问题我好像见过,但就是不记得怎么解决,记录下来方便以后查阅. 每次面试的时候,面试官总会问我,你在开发中遇到过哪些问题,怎么解决的?问题嘛,挺多的,但是你要我叙述嘛,我......我......我居然一时想不起来,迷之尴尬????(面试官当时想法:

iOS开发中文件的上传和下载功能的基本实现-备用

感谢大神分享 这篇文章主要介绍了iOS开发中文件的上传和下载功能的基本实现,并且下载方面讲到了大文件的多线程断点下载,需要的朋友可以参考下 文件的上传 说明:文件上传使用的时POST请求,通常把要上传的数据保存在请求体中.本文介绍如何不借助第三方框架实现iOS开发中得文件上传. 由于过程较为复杂,因此本文只贴出部分关键代码. 主控制器的关键代码: 复制代码代码如下: YYViewController.m#import "YYViewController.h" #define YYEnc

深入理解 iOS 开发中的锁

来源:伯乐在线 - 夏天然后 链接:http://ios.jobbole.com/89474/ 点击 → 申请加入伯乐在线专栏作者 摘要 本文的目的不是介绍 iOS 中各种锁如何使用,一方面笔者没有大量的实战经验,另一方面这样的文章相当多,比如 iOS中保证线程安全的几种方式与性能对比.iOS 常见知识点(三):Lock.本文也不会详细介绍锁的具体实现原理,这会涉及到太多相关知识,笔者不敢误人子弟. 本文要做的就是简单的分析 iOS 开发中常见的几种锁如何实现,以及优缺点是什么,为什么会有性能上

iOS开发中的ARC内存管理de技术要点

本文旨在通过简明扼要的方式总结出iOS开发中ARC(Automatic Reference Counting,自动引用计数)内存管理技术的要点,所以不会涉及全部细节.这篇文章不是一篇标准的ARC使用教程,并假定读者已经对ARC有了一定了解和使用经验.详细的关于ARC的信息请参见苹果的官方文档与网上的其他教程:) 本文的主要内容: ARC的本质 ARC的开启与关闭 ARC的修饰符 ARC与Block ARC与Toll-Free Bridging ARC的本质 ARC是编译器(时)特性,而不是运行时

iOS开发中UIPopoverController的使用详解

这篇文章主要介绍了iOS开发中UIPopoverController的使用,代码基于传统的Objective-C,需要的朋友可以参考下 一.简单介绍 1.什么是UIPopoverController 是iPad开发中常见的一种控制器(在iPhone上不允许使用) 跟其他控制器不一样的是,它直接继承自NSObject,并非继承自UIViewController 它只占用部分屏幕空间来呈现信息,而且显示在屏幕的最前面 2.使用步骤 要想显示一个UIPopoverController,需要经过下列步骤