1、GCD其他方法

1、GCD应用 单例模式

static dispatch_once_t onceToken;

dispatch_once(&onceToken, ^{

NSLog(@"执行一次%@",[NSThread currentThread]);

});

2、GCD延时操作

(1)第一种方式

[self performSelector:@selector(handleAction) withObject:nil afterDelay:0];

(2)第二种方式

DISPATCH_TIME_NOW 从现在开始

delayInSeconds 延迟几秒

dispatch_time_t time = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC));

when dispatch_time_t

dispatch_after(time, dispatch_get_main_queue(), ^{

NSLog(@"%@",[NSThread currentThread]);

});

3、调度组

(1)第一种形式

//创建调度组

dispatch_group_t group = dispatch_group_create();

//获取全局队列

dispatch_queue_t queue = dispatch_get_global_queue(0, 0);

//调度组的异步请求

dispatch_group_async(group, queue, ^{

[NSThread sleepForTimeInterval:2];

NSLog(@"下载第一张图");

});

dispatch_group_async(group, queue, ^{

[NSThread sleepForTimeInterval:3];

NSLog(@"下载第二张图");

});

dispatch_group_async(group, queue, ^{

[NSThread sleepForTimeInterval:1];

NSLog(@"下载第三张图");

});

dispatch_group_async(group, queue, ^{

[NSThread sleepForTimeInterval:5];

NSLog(@"下载第四张图");

});

//notify通知,当所有异步请求完成时调用dispatch_group_notify

dispatch_group_notify(group, queue, ^{

NSLog(@"更新UI”);

});

(2)第二种形式

//创建调度组

dispatch_group_t group = dispatch_group_create();

//获取全局队列

dispatch_queue_t queue = dispatch_get_global_queue(0, 0);

//进入队列

dispatch_group_enter(group);

dispatch_async(queue, ^{

[NSThread sleepForTimeInterval:2];

NSLog(@"下载第一张图");

//离开队列

dispatch_group_leave(group);

});

dispatch_group_enter(group);

dispatch_async(queue, ^{

[NSThread sleepForTimeInterval:1];

NSLog(@"下载第er张图");

dispatch_group_leave(group);

});

dispatch_group_enter(group);

dispatch_async(queue, ^{

[NSThread sleepForTimeInterval:3];

NSLog(@"下载第san张图");

dispatch_group_leave(group);

});

//等待调度队列wait相当于一个阻塞状态

dispatch_group_wait(group, DISPATCH_TIME_FOREVER);

NSLog(@"更新UI”);

(4)中断操作

dispatch_barrier_async一定是自定义队列

这里指定的并发队列应该是自己通过dispatch_queue_create函数创建的。

如果你传的是一个串行队列或者全局并发队列,这个函数等同于dispatch_async函数。

dispatch_queue_t queue = dispatch_queue_create("com.bjsxt", DISPATCH_QUEUE_CONCURRENT); //dispatch_get_global_queue(0, 0);

dispatch_async(queue, ^{

[NSThread sleepForTimeInterval:1];

NSLog(@"1");

});

dispatch_async(queue, ^{

[NSThread sleepForTimeInterval:3];

NSLog(@"2");

});

dispatch_async(queue, ^{

[NSThread sleepForTimeInterval:2];

NSLog(@"3");

});

//中断操作dispatch_barrier_async

dispatch_barrier_async(queue, ^{

NSLog(@"--------");

[NSThread sleepForTimeInterval:1];

});

dispatch_async(queue, ^{

[NSThread sleepForTimeInterval:1];

NSLog(@"4");

});

dispatch_async(queue, ^{

NSLog(@"5”);

});

(7)遍历操作

dispatch_queue_t queue = dispatch_get_global_queue(0, 0);

//iterations 遍历的次数

dispatch_apply(5, queue, ^(size_t i) {

NSLog(@"%@",@(i));

});

2、NSOperation基础

(1)创建方式

1)基于一个对象和selector来创建操作。如果你已经有现有的方法来执行需要的任务,就可以使用这个类

NSInvocationOperation * op = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(downImage) object:nil];

2)能够并发地执行一个或多个block对象,所有相关的block都执行完之后,操作才算完成

NSBlockOperation * op = [NSBlockOperation blockOperationWithBlock:^{

NSLog(@"%@",[NSThread currentThread]);

NSLog(@"第一个操作”);

}];

3)获取主队列

[[NSOperationQueue mainQueue] addOperationWithBlock:^{

NSLog(@"%@",[NSThread currentThread]);

NSLog(@"更新UI");

}];

3)如果我们想在一个NSOperation执行完毕后做一些事情,就调用NSOperation的setCompletionBlock方法来设置想做的事情

[op setCompletionBlock:^{ NSLog(@"完成”); }];

4) 通过addExecutionBlock方法添加block操作,开启多个线程

[op addExecutionBlock:^{

NSLog(@"%@",[NSThread currentThread]);

NSLog(@"第二个操作");

}];

(2)开始执行任务

1)一个NSOperation对象可以通过调用start方法来执行任务,默认是同步执行的。

[op start];(同步执行)

2)NSOperation是基于GCD的,把GCD的block封装成opertion,

NSOperationQueue是全局队列封装

将NSOperation添加到一个NSOperationQueue(操作队列)中去执行,而且是异步执行的。

//添加一个block形式的operation

[queue addOperationWithBlock:^{

NSLog(@"op3 - %@",[NSThread currentThread]);

}];

(3)添加任务

NSOperation添加到queue之后,通常短时间内就会得到运行。

waitUntilFinished yes 操作完成后执行下面的代码 no 先执行下面的代码

[queue addOperations:@[op,op2] waitUntilFinished:NO];

(4)设置最大并发数

self.queue.maxConcurrentOperationCount = 2;

(5)设置依赖关系

//添加NSOperation的依赖对象

[op2 addDependency:op1];

[op3 addDependency:op2];

注意:不能创建环形依赖,如A依赖B,B依赖A,这是错误的

(6)设置优先级

设置优先级,数据量少看不出

op1.queuePriority = -4;

(7)设置挂起状态

暂停一个queue不会导致正在执行的operation在任务中途暂停,只是简单地阻止调度新Operation执行

挂起状态设置

self.queue.suspended = !self.queue.suspended;

(8)取消queue中的操作

1.取消queue中所有的操作

[self.queue cancelAllOperations];

2.取消单个操作

[op cancel];

3、GCD和NSOperation的区别

GCD -- (iOS4.0)多线程解决方案

将任务(block)添加到队列(串行,并行(全局队列)),指定执行任务的方法。(同步,异步)

拿到dispatch_get_main_queue,线程之间的通信

NSOperation -- (iOS2.0)  (后经苹果改造)

将操作添加到队列里

[NSOperationQueue mainQueue]  获取主队列,将任务添加到主队列,就会在主线程中执行

NSOperation可以设置最大并发数(用GCD处理,比较麻烦)

可以暂停可以继续,也就是挂起操作

取消所有的任务

设置依赖关系

iOS 多线程讲解2的更多相关文章

  1. iOS 多线程讲解

    //同步操作用途 dispatch_queue_t queue = dispatch_get_global_queue(0, 0); dispatch_sync(queue, ^{ NSLog(@&q ...

  2. iOS多线程的详情使用示例--简进祥

    大家都知道,在开发过程中应该尽可能减少用户等待时间,让程序尽可能快的完成运算.可是无论是哪种语言开发的程序最终往往转换成汇编语言进而解释成机器码来执行.但是机器码是按顺序执行的,一个复杂的多步操作只能 ...

  3. iOS多线程

    关于iOS多线程 概述 这篇文章中,我不会说多线程是什么.线程和进程的区别.多线程有什么用,当然我也不会说什么是串行.什么是并行等问题,这些我们应该都知道的. 在 iOS 中其实目前有 4 套多线程方 ...

  4. iOS多线程开发

    概览 大家都知道,在开发过程中应该尽可能减少用户等待时间,让程序尽可能快的完成运算.可是无论是哪种语言开发的程序最终往往转换成汇编语言进而解释成机器码来执行.但是机器码是按顺序执行的,一个复杂的多步操 ...

  5. iOS多线程编程之NSThread的使用

      目录(?)[-] 简介 iOS有三种多线程编程的技术分别是 三种方式的有缺点介绍 NSThread的使用 NSThread 有两种直接创建方式 参数的意义 PS不显式创建线程的方法 下载图片的例子 ...

  6. 关于iOS多线程的总结

    关于iOS多线程的总结   在这篇文章中,我将为你整理一下 iOS 开发中几种多线程方案,以及其使用方法和注意事项.当然也会给出几种多线程的案例,在实际使用中感受它们的区别.还有一点需要说明的是,这篇 ...

  7. iOS多线程编程之NSThread的使用(转)

    本文由http://blog.csdn.net/totogo2010/原创 1.简介: 1.1 iOS有三种多线程编程的技术,分别是: 1..NSThread 2.Cocoa NSOperation  ...

  8. iOS 多线程详解

    iOS开发 多线程 概览 机器码是按顺序执行的,一个复杂的多步操作只能一步步按顺序逐个执行.改变这种状况可以从两个角度出发: 对于单核处理器,可以将多个步骤放到不同的线程,这样一来用户完成UI操作后其 ...

  9. [转]iOS多线程编程之NSThread的使用

    1.简介: 1.1 iOS有三种多线程编程的技术,分别是: 1..NSThread 2.Cocoa NSOperation (iOS多线程编程之NSOperation和NSOperationQueue ...

随机推荐

  1. Codeforces 161 B. Discounts (贪心)

    题目链接:http://codeforces.com/contest/161/problem/B 题意: 有n个商品和k辆购物车,给出每个商品的价钱c和类别t(1表示凳子,2表示铅笔),如果一辆购物车 ...

  2. Codeforces 706 C. Hard problem (dp)

    题目链接:http://codeforces.com/problemset/problem/706/C 给你n个字符串,可以反转任意一个字符串,反转每个字符串都有其对应的花费ci. 经过操作后是否能满 ...

  3. UVaLive 7500 Boxes and Balls (数学)

    题意:给定 n 个球,每次从每篮子里拿出来一个放在一个新篮子里,并移除相同的,按球的个数进行排序,问你用最多几个球能完成循环. 析:数学问题,很容易发现前n项和就是最多的球数,所以我们只要找最大的n项 ...

  4. EasyUI Accordion下的Panel面板初始化时全部折叠

    EasyUI Accordion下的Panel面板有一个属性:selected,默认值为:false.初始化时,若设置'selected:true',则面板默认打开,效果如下: <div tit ...

  5. JPBM4.4基础及数据库说明

    JPBM4.4基础及数据库说明 对jBPM4.4数据库的几张表简单介绍: A.资源库和运行时表结构 JBPM4_DEPLOYMENT   流程定义表                           ...

  6. Android - Facebook KeyHash 設定

    转自:http://www.dotblogs.com.tw/newmonkey48/archive/2014/04/17/144779.aspx App要使用Facebook 分享時,設要在Faceb ...

  7. A few things to remember while coding in Python.

    A few things to remember while coding in Python. - 17 May 2012 - UPDATE: There has been much discuss ...

  8. 微吧里的各种margin负值

    直在做各种项目接各种需求,但你的代码能力得到提高了吗?不停的项目经历虽然能够增加你的代码行数,但不一定能提升你的代码质量,所以除了构建阶段的代码细扣,项目之后的代码总结是至关重要的. 微吧中除了模块化 ...

  9. Java常见排序算法之归并排序

    在学习算法的过程中,我们难免会接触很多和排序相关的算法.总而言之,对于任何编程人员来说,基本的排序算法是必须要掌握的. 从今天开始,我们将要进行基本的排序算法的讲解.Are you ready?Let ...

  10. Java数据结构之树和二叉树(2)

    从这里始将要继续进行Java数据结构的相关讲解,Are you ready?Let's go~~ Java中的数据结构模型可以分为一下几部分: 1.线性结构 2.树形结构 3.图形或者网状结构 接下来 ...