iOS多线程技术

简介:

iOS多线程技术主要分配NSThread、NSOperation和GCD。下边来简单的介绍一下吧。

随性一点,就不按照顺序来了。所以先介绍一下NSOperation。

------------------------------------------------------------------------------NSOperation------------------------------------------------------------------------------

NSBlockOperation:

它是NSOperation的一个具体的子类,它管理着并发执行的一个或者多个块操作。你可以使用这个对象一次执行多个连续的块,而没有必要去为每一个操作创建分开的操作对象。当执行超过一个block时,操作自己在所有块执行完毕后结束。

NSInvocationOperation:

它是NSOperation的一个具体子类,它管理执行一个单独的封装的任务作为一个调用。你可以使用这个类开始一个调用指定对象的选择器操作。这个类实现的是非并发操作。

NSOperationQueue:

该类控制一套NSOperation对象的执行。当把operation添加到队列,它会一直存在在该队列中,直到确信它取消或者结束执行它的任务。在queue(还没有执行)中的operation都是自己组织执行根据优先级和相互作用对象依赖。一个application可能会创建多个操作队列,然后执行他们其中的任何一个操作。

需要注意:NSOperationQueue为NSOperation分配不同的线程来执行。

 

复制代码
- (void)testOperationQueue {
    NSOperationQueue *operationQueue = [[NSOperationQueue alloc] init];
    NSBlockOperation *blockOperation1 = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"blockOperation1:%p",[NSThread currentThread]);
        
    }];
    NSBlockOperation *blockOperation2 = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"blockOperation2:%p",[NSThread currentThread]);
    }];
    NSBlockOperation *blockOperation3 = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"blockOperation3:%p",[NSThread currentThread]);
    }];
    
    [operationQueue addOperation:blockOperation1];
    [operationQueue addOperation:blockOperation2];
    [operationQueue addOperation:blockOperation3];
}
复制代码

上面是一个简单的测试程序,我们可以看到在一个NSOperationQueue中添加了三个块操作。然后执行结果如下:

第一次执行:

2015-08-21 09:25:24.954 GCD[1251:280098] main Thread is 0x7ff3fc111ac0
2015-08-21 09:25:24.955 GCD[1251:280205] blockOperation3:0x7ff3f8f09ea0
2015-08-21 09:25:24.955 GCD[1251:280206] blockOperation1:0x7ff3fc31dd50
2015-08-21 09:25:24.955 GCD[1251:280207] blockOperation2:0x7ff3f8f09dc0

可见NSOperationQueue为NSBlockOperation分配了不同的线程。而是是并发操作。也就是说NSOperation默认是并发执行的,要想串行执行很简单,只需要设置一下NSOperationQueue的一个属性即可:

  operationQueue.maxConcurrentOperationCount = 1;

该属性来控制NSOperationQueue的最大并发数量,当设置为1是就是串行执行了。

接下来看看下边的代码:

复制代码
- (void)testOperationQueue {
//    NSOperationQueue *operationQueue = [[NSOperationQueue alloc] init];
    NSBlockOperation *blockOperation1 = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"blockOperation1:%p",[NSThread currentThread]);
        
    }];
    NSBlockOperation *blockOperation2 = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"blockOperation2:%p",[NSThread currentThread]);
    }];
    NSBlockOperation *blockOperation3 = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"blockOperation3:%p",[NSThread currentThread]);
    }];
//    operationQueue.maxConcurrentOperationCount = 1;
//    [operationQueue addOperation:blockOperation1];
//    [operationQueue addOperation:blockOperation2];
//    [operationQueue addOperation:blockOperation3];
    [blockOperation1 start];
    [blockOperation2 start];
    [blockOperation3 start];
}
复制代码

我没有将NSBlockOperation放到NSOperationQueue中,而是直接自己调用了start方法,此时会有什么结果呢???????

看结果:

2015-08-21 09:33:21.451 GCD[1423:316980] main Thread is 0x7fe178a11a70
2015-08-21 09:33:21.451 GCD[1423:316980] blockOperation1:0x7fe178a11a70
2015-08-21 09:33:21.452 GCD[1423:316980] blockOperation2:0x7fe178a11a70
2015-08-21 09:33:21.452 GCD[1423:316980] blockOperation3:0x7fe178a11a70

结果表明:当我直接去调用NSOperation的start方法时,此时所有的NSOperation都是在主线程上执行的。因为他们的线程地址一样。而且是顺序执行的。

此外,NSOperation还提供了cancel方法,不过这里cancel只能取消状态为Ready、Finish的NSOperation,不能取消正在执行的操作。

再此外,NSOperation还提供了addDependency:方法。

addDependency方法的作用是使接收者一栏指定操作的完成。接收者不考虑去执行它自己直到所有它的依赖操作结束执行。如果接收者准备执行它的任务,添加依赖就没有实际性的影响了。该方法可能改变接收者的isReady和依赖属性。举个例子:

 [operation3 addDependency:operation2];    //操作3依赖于操作2

如上边那句代码,意思是operation3依赖于operation2的操作,如果operation2没有执行,并且operation3还没有准备执行它的任务,那么他们的执行顺序一定是operation2先执行,然后operation3后执行。

------------------------------------------------------NSBlockOperation结束---------------------------------------------------------------------------------

NSInvocation

上边已经介绍了这个类的大概作用,现在来看看它的使用:

复制代码
- (void)viewDidLoad {
    [super viewDidLoad];
    NSLog(@"main Thread is %p",[NSThread mainThread]);
    [self nsInvocationOperationTest];
}
- (void)nsInvocationOperationTest {
    NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(test) object:nil];
    [operation start];
}
- (void)test {
    NSLog(@"operation:%p",[NSThread currentThread]);
}
复制代码

执行结果如下:

2015-08-21 10:52:23.359 GCD[2193:756929] main Thread is 0x7f9442e07fe0
2015-08-21 10:52:23.360 GCD[2193:756929] operation:0x7f9442e07fe0

操作对象默认在主线程中执行,这个和NSBlockOperation一样。如果是多个则是串行执行。如果我们没有把它放在NSOperationQueue中,都是在主线程执行。

NSOperation总结:

NSBlockOperation可以单独的调用start执行,但是此时都是再主队列中执行的。

NSBlockOperatioin可以添加到NSOperationQueue中执行,此时都是新建的线程执行。可以通过cancel取消ready和执行完毕的线程和addDependency设置线程依赖。

-------------------------------------------------------------------------------------NSOperation结束-------------------------------------------------------------------------------------

NSThread

它是比NSOperation和GCD都要轻量级的线程。

它有两种直接创建形式

 [[NSThread alloc] initWithTarget:<#(id)#> selector:<#(SEL)#> object:<#(id)#>];
  [NSThread detachNewThreadSelector:<#(SEL)#> toTarget:<#(id)#> withObject:<#(id)#>]

也就是第一个种使用实例方法。initWithTawrget...那个。第二个是使用的类方法。

第一种创建的线程是先创建线程对象,然后在运行线程操作,需要手动调用start方法。

第二种是直接创建线程并且开始运行线程。

还有一种不显式创建线程的方法:

    [self performSelector:<#(SEL)#> withObject:<#(id)#>]

就是使用NSObject的类方法。

---------------------------------------------------------------------------NSThread就这么多吧---------------------------------------------------------------------------

至于GCD,请参考这里

现在来对比一下三者:

NSThread:

优点:比其他两个轻量级、使用简单

缺点,需要自己管理线程的生命周期、线程同步、加锁、睡眠等。

NSOperation:

优点:不需要关心线程管理以及数据同步

NSOperation是面向对象的。

GCD:

iOS4.0+才能使用,是替代NSThread/NSOperation的高效和强大的技术。

它是基于C语言的。

------------------------------------------------------------------先介绍这么多吧------------------------------------------------------------------

addDependency

相关文章
|
1月前
|
数据采集 网络协议 开发工具
如何进行iOS技术博客的备案?
如何进行iOS技术博客的备案?
24 2
|
1月前
|
移动开发 安全 数据安全/隐私保护
iOS代码混淆和加固技术详解
iOS代码混淆和加固技术详解
33 0
|
30天前
|
安全 Python
Python中的并发编程:多线程与多进程技术探究
本文将深入探讨Python中的并发编程技术,重点介绍多线程和多进程两种并发处理方式的原理、应用场景及优缺点,并结合实例分析如何在Python中实现并发编程,以提高程序的性能和效率。
|
4月前
|
网络安全 开发者 iOS开发
iOS技术博客:App备案指南
本文介绍了移动应用程序(App)备案的重要性和流程。备案是规范App开发和运营的必要手段,有助于保护用户权益、维护网络安全和社会秩序。为了帮助开发者更好地了解备案流程,本文提供了一份最新、最全、最详的备案指南,包括备案目的、好处、对象、时间、流程、条件和注意事项等内容。
iOS技术博客:App备案指南
|
7月前
|
Java 调度
带你读《2022技术人的百宝黑皮书》——合理使用线程池以及线程变量(3)
带你读《2022技术人的百宝黑皮书》——合理使用线程池以及线程变量(3)
|
25天前
|
NoSQL 数据处理 调度
【Redis深度专题】「踩坑技术提升」探索Redis 6.0为何必须启用多线程以提升性能与效率
【Redis深度专题】「踩坑技术提升」探索Redis 6.0为何必须启用多线程以提升性能与效率
58 0
|
1月前
|
缓存 编译器 程序员
C/C++编译器并行优化技术:并行优化针对多核处理器和多线程环境进行优化,以提高程序的并行度
C/C++编译器并行优化技术:并行优化针对多核处理器和多线程环境进行优化,以提高程序的并行度
61 0
|
2月前
|
安全 Java
Java中的多线程编程技术
【2月更文挑战第7天】本文介绍了Java中的多线程编程技术,包括线程的创建、启动和管理,以及常见的线程同步机制。通过深入讲解多线程编程的相关概念和技巧,帮助读者理解并掌握在Java开发中充分利用多线程提升程序性能的方法。
|
2月前
|
人工智能 vr&ar Android开发
探索安卓与iOS系统的技术进展
【2月更文挑战第4天】本文将探讨安卓与iOS两大操作系统在最新技术进展方面的差异与相似之处。我们将分析它们在人工智能、增强现实、隐私保护等方面的创新和发展,并展望未来可能出现的趋势。通过对比这两个操作系统的技术特点,读者将能够更好地了解并选择适合自己需求的智能设备。

热门文章

最新文章