IOS多线程操作

多线程的概念


 进程

  ·正在运行中的程序被成为进程,负责程序运行的内存分配  

  ·没一个进程都有自己独立的虚拟内存空间

 线程

  ·线程是进程中一个独立的执行路径也称之为控制单元

  ·一个进程至少包含一条线程,主线程

  ·可以将耗时的执行路径如网络请求放在其他线程中执行

 创建线程的目的就是为了开启一条新的执行路径,运行指定的代码,与主线程中的代码实现同时执行

 还要解释一个概念:多任务调度系统

  每个应用程序由操作系统分配的短暂的时间片(Timeslice)轮流使用CPU,由于CPU对每个时间片的处理速度非常快,因此,用户看来好像这些任务在同时执行的

  并发:指的是两个或者多个任务在同一时间间隔内发生,但是在任意时刻上CPU只会执行一个任务。

 IOS多线程实现的方式:

  1.NSObject多线程技术

  1>想要在某个方法中开启新的线程可以直接调用performSelectorInBackground方法来开启,selector中的方法就是要执行的操作

  2>使用performSelectorOnMainThread可以重新回到主线程中,执行UI的操作都要回到主线程中(官方的规定,如果不这么做很可能出现不可预料的问题)

  3>为了模拟线程的创建,这里采用线程休眠的方式进行模拟,相当于进行了网络请求的操作

mark:虽然在其他的线程中依然能够改变UI,但是强烈的不建议这么去做!还有一个很重要的问题是使用NSThread和NSObject的线程操作都要使用autoreleasepool,否则会出现内存泄露

 1 - (void)viewDidLoad
2 {
3 [super viewDidLoad];
4 //使用performSelectorInBackground可以开启后台线程,执行selector选择器选择的方法
5 // 2> 使用performSelectorOnMainThread可以重新回到主线程执行任务,通常用于后台线程更新界面UI时使用
6 // 注意:在使用NSThread或者NSObject的线程方法时,一定要使用自动释放池,否则容易出现内存泄露。
7 //提示:使用performSelectorInBackground也可以直接修改UI,但是强烈不建议使用。修改UI最好在主线程中执行
8 [self performSelectorInBackground:@selector(testObject) withObject:nil];
9
10 NSLog(@"%@",[NSThread currentThread]);
11 }
12
13 -(void)testObject
14 {
15 //自动释放池,避免出现内存泄露
16 @autoreleasepool {
17 //让当前线程睡眠2s
18 [NSThread sleepForTimeInterval:2.0f];
19
20 NSLog(@"%@",[NSThread currentThread]);
21 }
22 }

  2.NSThread线程方法

  
 1.通过类方法直接产生新的线程调用方法:detachNewThreadSelctor,自动执行selector中的方法

  
 2.通过实例方法产生新的线程调用initWithTarget方法,需要调用实例的start方法来执行选择器的方法

  
 3.NSThread也需要使用autoreleasepool进行内存管理

+ ?





1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

- (void)viewDidLoad

{

    [super
viewDidLoad];

    //NSThread类方法开启线程

//    [NSThread detachNewThreadSelector:@selector(testThread) toTarget:self withObject:nil];

    //实例方法开启线程

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

    //调用start方法才能执行selector的方法

    [thread
start];

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

}

-(void)testThread

{

    @autoreleasepool
{

        //线程休眠,模拟耗时操作

        [NSThread
sleepForTimeInterval:2.0f];

        

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

    }

}

  3.使用NSOperation实现多线程

   1.第一种实现多线程的方式

    (1)新建一个队列来储存需要的操作

    (2)新建一个NSInvocationOpertaion的实例来存储一个操作

    (3)将新建的操作添加到新建的队列中去以此来按照队里的先进先出的特点进行操作的执行

  

?





1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

@interface
SWBViewController ()

{

    NSOperationQueue
*_queue;

}

@end

@implementation
SWBViewController

- (void)viewDidLoad

{

    [super
viewDidLoad];

    

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

    

    //1初始化队列

    _queue = [[NSOperationQueue
alloc]init];

    

    //2创建线程

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

    //3开启线程

    [_queue addOperation:op];

    // Do any additional setup after loading the view, typically from a nib.

}

- (void)testObject

{

//    [NSThread sleepForTimeInterval:2.0f];

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

}

    2.使用NSBlockOperation来实现多线程操作

      (1)创建一个队列以便储存需要执行的操作

      (2)使用[NSBlockOperation
blockOperationWithBlock]新建一个块代码操作,在快代码内部存储需要执行的代码

      (3)将块代码操作放入到队列中去执行同样的先进先出操作

 #mark
NSOperation是使用GCD实现的一套Objective-c的API,是面向对象的线程技术提供了一些额外的方法来方便操作

      (1)[NSOpeationQueue
mainQueue] addOperation ^{};//更新UI的主队列操作放在快代码执行

      (2)setMaxConcurrentOperationCount;//设置并发的最大线程数量

      (3)设置线程之间的依赖关系addDependency可以设置任务的执行顺序,同时可以跨操作队列指定依赖关系(指定依赖不能循环指定)

?





1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

@interface
SWBViewController ()

{

    NSOperationQueue
*_queue;

}

@end

@implementation
SWBViewController

- (void)viewDidLoad

{

    [super
viewDidLoad];

    

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

    

    //1初始化队列

    _queue = [[NSOperationQueue
alloc]init];

    

//    //2创建线程

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

    NSBlockOperation
*op = [NSBlockOperation
blockOperationWithBlock:^{

        // 让当前线程睡眠 2.0 秒

        [NSThread
sleepForTimeInterval:2.0f];

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

    }];

    //3开启线程

    [_queue addOperation:op];

    // Do any additional setup after loading the view, typically from a nib.

}

  

  4.GCD多线程技术

    (1)是基于C语言的底层API

    (2)使用block定义任务使用灵活方便

    (3)提供了更多的控制能力以及操作队列中所不能使用的底层函数

  GCD的基本思想就是将操作放在队列中执行

    1.操作使用block定义

    2.队列负责调度任务执行所在的线程以及具体的执行时间

    3.队里的特点是先进先出,新添加的操作都会排在尾部。

 

时间: 2024-10-07 05:03:09

IOS多线程操作的相关文章

ios多线程操作(一)—— 多线程基础与原理

一.进程 进程是指在系统中正在运行的一个应用程序,每个进程之间都是独立的,每个进程都运行在其专用且受保护的内存空间内 二.线程 一个进程要想执行任务就必须要有线程,每一个进程至少都要有一条线程. 线程是进程的基本执行单元,一个进程的所有任务都在线程中执行. 线程又分为主线程和子线程: 主线程:一个ios程序运行后,默认会开启一条线程,称为"主线程"或"UI线程",ios上任何UI的操作都在主线程上执行 子线程:除主线程外进程中得其他线程,程序中一般都将耗时的操作添加

ios多线程操作(六)—— GCD全局队列与主队列

GCD默认已经提供了全局的并发队列供整个应用使用,所以可以不用手动创建. 创建全局队列的函数为 dispatch_queue_t q = dispatch_get_global_queue(long identifier, unsigned long flags) 参数类型为: long identifier:ios 8.0 告诉队列执行任务的"服务质量 quality of service",系统提供的参数有: QOS_CLASS_USER_INTERACTIVE 0x21,    

ios多线程操作(七)—— GCD延迟操作与一次性代码

使用GCD函数可以进行延时操作,该函数为 dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ }); 现在我们来分解一下参数 dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC)) : NSEC_PER_SEC在头文

ios多线程操作(四)—— GCD核心概念

GCD全称Grand Central Dispatch,可译为"大派发中枢调度器",以纯C语言写成,提供了许多非常强大的函数.GCD是苹果公司为多核的并行运算提出的解决方案,它可以自动利用更多的CPU内核来参与运算,会自动管理线程的生命周(创建线程.调度任务.销毁线程),而程序员只需要告诉GCD想要执行什么任务,不需要编写任何线程管理代码! GCD中有两个核心概念,一是任务,二是队列. 任务:要执行什么样的操作.任务都是预先以Block封装好准备要执行的一段代码. 队列:用来存放任务,

ios多线程操作(八)—— GCD调度组

有这么一个需要,分别执行2个耗时的异步操作,等2个异步操作都执行完毕后在回到主线程执行操作.如果想要快速高效地实现这个需求,可以考虑使用调度组. 调度组的创建代码如下: [objc] view plain copy dispatch_group_t group = dispatch_group_create(); 往调度组里面添加任务的函数如下: [objc] view plain copy dispatch_group_async(dispatch_group_t group, dispatc

ios多线程操作(十一)—— NSOperation的高级操作

NSOperation可以调用start方法来执行任务,但默认是同步执行的,如果将NSOperation添加到      NSOperationQueue(操作队列)中,系统会自动异步执行队列中的操作. NSOperationQueue中可以对操作进行取消,暂停和恢复 取消函数为: [objc] view plain copy - (void)cancelAllOperations; 也可以调用NSOperation的cancel方法来取消单个操作 [objc] view plain copy

ios多线程操作(五)—— GCD串行队列与并发队列

GCD的队列可以分为2大类型,分别为串行队列和并发队列 串行队列(Serial Dispatch Queue): 一次只调度一个任务,队列中的任务一个接着一个地执行(一个任务执行完毕后,再执行下一个任务) 创建一个队列 dispatch_queue_t q = dispatch_queue_create(const char *label, dispatch_queue_attr_t attr) 参数: const char *label:队列的名称 dispatch_queue_attr_t

iOS 数据库多线程操作

SQLite是支持多线程操作的, 需要在初始化database是做一个线程安全的config,参考下面链接,看起来比较复杂. http://www.cnblogs.com/wfwenchao/p/3964213.html 很多iOS项目中都使用FMDB这个第三方开源库,但FMDB不能在多个线程中共同一个FMDatabase对象,因为这个类本身不是线程安全的,如果这样使用会造成数据混乱等问题. 如要需要多线程操作数据库,那么就需要使用FMDatabaseQueue来保证线程安全了. 首先用一个数据

iOS多线程拾贝------操作巨人编程

iOS多线程拾贝------操作巨人编程 多线程 基本 实现方案:pthread - NSThread - GCD - NSOperation Pthread 多平台,可移植 c语言,要程序员管理生命周期 创建 //这里已经开启了多线程,直接在这里调用子线程想要调用的代码 void * run(void *pramga) { NSLog(@"-------"); return NULL; } - (IBAction)btnClick:(id)sender { pthread_t pth