热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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 }
View Code

  2.NSThread线程方法

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

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

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

 

 

  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.队里的特点是先进先出,新添加的操作都会排在尾部。

 

 

 

 

 

 

 

 

 

 

 

 

IOS多线程操作,,

IOS多线程操作


推荐阅读
  • Android工程师面试准备及设计模式使用场景
    本文介绍了Android工程师面试准备的经验,包括面试流程和重点准备内容。同时,还介绍了建造者模式的使用场景,以及在Android开发中的具体应用。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 本文介绍了使用kotlin实现动画效果的方法,包括上下移动、放大缩小、旋转等功能。通过代码示例演示了如何使用ObjectAnimator和AnimatorSet来实现动画效果,并提供了实现抖动效果的代码。同时还介绍了如何使用translationY和translationX来实现上下和左右移动的效果。最后还提供了一个anim_small.xml文件的代码示例,可以用来实现放大缩小的效果。 ... [详细]
  • 基于layUI的图片上传前预览功能的2种实现方式
    本文介绍了基于layUI的图片上传前预览功能的两种实现方式:一种是使用blob+FileReader,另一种是使用layUI自带的参数。通过选择文件后点击文件名,在页面中间弹窗内预览图片。其中,layUI自带的参数实现了图片预览功能。该功能依赖于layUI的上传模块,并使用了blob和FileReader来读取本地文件并获取图像的base64编码。点击文件名时会执行See()函数。摘要长度为169字。 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • 后台获取视图对应的字符串
    1.帮助类后台获取视图对应的字符串publicclassViewHelper{将View输出为字符串(注:不会执行对应的ac ... [详细]
  • Redis底层数据结构之压缩列表的介绍及实现原理
    本文介绍了Redis底层数据结构之压缩列表的概念、实现原理以及使用场景。压缩列表是Redis为了节约内存而开发的一种顺序数据结构,由特殊编码的连续内存块组成。文章详细解释了压缩列表的构成和各个属性的含义,以及如何通过指针来计算表尾节点的地址。压缩列表适用于列表键和哈希键中只包含少量小整数值和短字符串的情况。通过使用压缩列表,可以有效减少内存占用,提升Redis的性能。 ... [详细]
  • STL迭代器的种类及其功能介绍
    本文介绍了标准模板库(STL)定义的五种迭代器的种类和功能。通过图表展示了这几种迭代器之间的关系,并详细描述了各个迭代器的功能和使用方法。其中,输入迭代器用于从容器中读取元素,输出迭代器用于向容器中写入元素,正向迭代器是输入迭代器和输出迭代器的组合。本文的目的是帮助读者更好地理解STL迭代器的使用方法和特点。 ... [详细]
  • 如何自行分析定位SAP BSP错误
    The“BSPtag”Imentionedintheblogtitlemeansforexamplethetagchtmlb:configCelleratorbelowwhichi ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 本文介绍了操作系统的定义和功能,包括操作系统的本质、用户界面以及系统调用的分类。同时还介绍了进程和线程的区别,包括进程和线程的定义和作用。 ... [详细]
  • 篇首语:本文由编程笔记#小编为大家整理,主要介绍了软件测试知识点之数据库压力测试方法小结相关的知识,希望对你有一定的参考价值。 ... [详细]
  • HashMap的相关问题及其底层数据结构和操作流程
    本文介绍了关于HashMap的相关问题,包括其底层数据结构、JDK1.7和JDK1.8的差异、红黑树的使用、扩容和树化的条件、退化为链表的情况、索引的计算方法、hashcode和hash()方法的作用、数组容量的选择、Put方法的流程以及并发问题下的操作。文章还提到了扩容死链和数据错乱的问题,并探讨了key的设计要求。对于对Java面试中的HashMap问题感兴趣的读者,本文将为您提供一些有用的技术和经验。 ... [详细]
author-avatar
Gemini强强Gemini
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有