iOS经典讲解之多线程应用场景

ios多线程开发的常用四种方式和基本使用 ios多线程开发的常用四种方式和基本使用,pthread、NSThread、NSOperation\NSOperationQueue、GCD 立即下载
<pre name="code" class="objc">   通过下面一个例子来了解一下多线程的应用场景,我们可以通过点击按钮来开始或者暂停动画的播放,但是当我们点击另一个按钮时,
就会执行一个方法,在该方法中循环打印一个很大的数字,在打印过程中,再通过点击播放/暂停按钮来控制动画已经无法做到了
,这时屏幕已经卡死,必须等待打印完成,才能控制动画的播放。如何既能打印又能控制动画的播放那,可以利用多线程来完成,
将打印交给子线程去完成就可以了,下面讲了几种简单开启的子线程方法,非常详细。在进入例子之前先来了解一下线程的基础知识。
<pre name="code" class="objc">/**
 *  进程:一个正在运行的程序,叫一个进程
    多进程:多个程序正在运行,叫多进程
    线程:一个程序或者说一个进程 都会有一个或多个线程 如果只有一个 我们叫他主线程 主线程负责用户能看见的任务 例如添加控件 刷新页面,除了主线程以外
都叫子线程, 线程之间是独立的没有任何联系,子线程一般负责用户不直接看到的任务 例如加载图片的过程 下载视频等。
 线程要明确的:只要用户看得见的 或者 跟用户看得见有关的 都使用主线程 进行操作。 因为开启子线程操作的时候 是为了更好地用户体验 
用户体验直接的表现为看到的或者点击的流畅性。
 线程是耗费资源的,虽然可以多线程操作 可以提高用户体验 但是不建议 进行很多线程同时进行操作。
 */

#import "RootViewController.h"

@interface RootViewController ()

// 声明一个imageView
@property (nonatomic, retain) UIImageView *imageView;

@end

@implementation RootViewController



-(void)dealloc
{
    [_imageView release];
    [super dealloc];
}

- (void)viewDidLoad {
    [super viewDidLoad];

    [self addSubviews];

}

// 创建imageView并添加图片按钮
- (void)addSubviews
{
    self.imageView = [[UIImageView alloc] initWithFrame:CGRectMake(50, 100, 200, 200)];
    self.imageView.backgroundColor = [UIColor redColor];
    [self.view addSubview:self.imageView];
    [_imageView release];
    
    // 播放一组图片
    NSMutableArray *imageArray = [NSMutableArray array];
    for (int i = 0; i < 3; i++) {
        UIImage *image = [UIImage imageNamed:[NSString stringWithFormat:@"pic%d", i + 4]];
        // 加进数组
        [imageArray addObject:image];
    }
    // 设置播放属性
    self.imageView.animationImages = imageArray;
    self.imageView.animationDuration = 0.5;
    self.imageView.animationRepeatCount = 0;
    
    // 点击按钮 开始播再点击按钮停止播
    
    UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
    button.frame = CGRectMake(100, 320, 50, 50);
    button.backgroundColor = [UIColor blueColor];
    [button setTitle:@"播放" forState:UIControlStateNormal];
    [button setTitle:@"停止" forState:UIControlStateSelected];
    [button addTarget:self action:@selector(actionButton:) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:button];
    
    // 点击另一个按钮 循环打印
    UIButton *button1 = [UIButton buttonWithType:UIButtonTypeCustom];
    button1.frame = CGRectMake(160, 320, 50, 50);
    button1.backgroundColor = [UIColor blueColor];
    [button1 setTitle:@"打印" forState:UIControlStateNormal];
    [button1 addTarget:self action:@selector(actionPrint:) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:button1];
    
    //需要一边打印 一边还能 开关动画
    // 解决方案:开启一个子线程去完成打印的工作
#pragma mark ----NSThread----
    // 这是一个最轻量级的线程 可以开启线程和关闭线程
    // 创建一个线程 就是给他一个方法去执行
    // 创建一个子线程专门去打印
    NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(actionPrint:) object:nil];
    // 开启这个线程
   [thread start];
    // 注意:线程操作的时候
    // 在主线程的时候 系统自动添加了一个 自动释放池 那么咱们在开启子线程的时候 也要添加一个自动释放池
    // 如果你的线程开的比较多 会造成代码比较乱 阅读性不高
    // 一般方法中 添加了自动释放池 基本上都是线程方法
    
#pragma mark ---NSObject
    //NSObject也提供了开启线程的方法 也可以解决程序卡死问题
    [self performSelectorInBackground:@selector(actionPrint:) withObject:nil];
    //NSOperation也是抽象类 没有实现具体功能
    //NSInvocationOperation 调用操作(相当于任务)
    //NSBlockOperation block操作(相当于任务)
    //NSOperationQueue 线程队列
    //创建任务一
    NSInvocationOperation *invocation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(invocation1) object:nil];
    
    // 创建任务二
    NSBlockOperation *blockOP2 = [NSBlockOperation blockOperationWithBlock:^{
        // block 块中 就相当于添加了任务
        [self blockOP2];
    }];
    
    // 创建一个队列
    NSOperationQueue *queue = [[NSOperationQueue alloc] init];
    // 注意 添加任务前要设置依赖关系
    // 依赖性(串行)
    [invocation addDependency:blockOP2]; // 前面完成 后面才能开始
    // 把任务添加到队列当中
    [queue addOperation:invocation];
    [queue addOperation:blockOP2];
    // 设置线程最大并发数
    queue.maxConcurrentOperationCount = 2;
    
    // 需求 进行同步请求一张图片 不产生屏幕卡顿
    // 思路:开启一个子线程 进行同步请求图片 图片加载完成后回到主线程 显示到imageView上
    
}
// 实现任务一
- (void)invocation1
{
    // 子线程中添加一个自动释放池
    @autoreleasepool {
    //[NSThread currentThread] 当前线程的信息
    //打印是否是主线程
    // 打印出来的number 是线程的个数 第几个线程
    NSLog(@"%@ 是不是主线程:%d", [NSThread currentThread], [NSThread isMainThread]);
        
    }
}
// 创建任务二
- (void)blockOP2
{
    @autoreleasepool {
        
    NSLog(@"%@ 是不是主线程:%d", [NSThread currentThread], [NSThread isMainThread]);
        
    }
}
// 点击按钮 开始播再点击按钮停止播
- (void)actionButton:(UIButton *)button
{
    button.selected = !button.selected;
    if (button.selected == YES) {
        
        [self.imageView startAnimating];

    } else {
        
        [self.imageView stopAnimating];
    }
}

// 循环打印 卡死程序
- (void)actionPrint:(UIButton *)button
{
    // 添加一个自动释放池
    
    @autoreleasepool {
       for (int i = 0; i < 888888888; i++) {
        NSLog(@"%d", i);
    }
}
}

@end



高等数学/概率论/数理统计/线性代数/离散数学面试-核心概念-问题理解 特征值与特征向量是线性代数中的概念,它们与线性变换有关。在线性变换中,如果存在非零向量 v ,使得当该向量通过变换后,其方向不变,只是长度发生了变化,那么这个向量 v 就是特征向量。而这个长度变化的比例因子,即变换前后向量长度的比值,称为特征值。数学公式表示:通俗易懂的解释:想象一下,你有一个可以伸缩的橡皮筋,这个橡皮筋可以代表一个向量。现在,你有一个特殊的机器,它可以改变橡皮筋的形状,但不会改变它延伸的方向。当你把橡皮筋放入机器中,机器会拉伸或压缩橡皮筋,但橡皮筋的方向保持不变。 阅读详情

相关推荐

【超详细】数据分析笔试题分享,可以收藏后仔细阅读_数据分析岗位笔试题目

这种做法是最精确的做法,保留了所有的信息,也未添加任何额外信息,若预处理时把所有的变量都这样处理,会大大增加数据的维度。15、在某座城市出现了某种流行病,且已知某座城市男女人数相同,男性患该病的概率为5%,女性为0.25%,现已知该城市的小明得了此病,请问小明为男性的概率是() B。D项,使用方差作为特征评分标准,如果某个特征的取值差异不大,通常认为该特征对区分样本的贡献度不大,因此在构造特征过程中去掉方差小于阈值的特征。LTV,用户生命周期价值,是产品从用户获取到流失所得到的全部收益的总和。

2401_89824744的博客 949

iOS 多线程使用示例

NSOperation是iOS中另一个常用的多线程技术,它是一个抽象类,可以用来封装一个任务。在这个示例中,我们创建了一个名为operation的NSBlockOperation对象,并将其添加到名为queue的NSOperationQueue中。在iOS中,多线程是指同时执行多个任务的能力。在这个示例中,我们手动创建了一个名为myThread的线程,并将其绑定到一个名为myThreadMainMethod的方法上。在本文中,我们将介绍iOS多线程的使用示例,以帮助开发人员更好地理解和应用多线程技术。

Alamo Fire 2237

Kylin-Desktop-V10-SP1海光版虚拟机安装全流程(含桥接网络配置)

本文详细介绍了在VMware虚拟机中安装Kylin-Desktop-V10-SP1海光版操作系统的完整流程,重点解决了基于海光(Hygon C86)平台的网络配置难题。内容涵盖从镜像准备、虚拟机创建、系统安装到桥接网络配置的三种实战方法,并提供了安装后的优化与必备软件配置指南,帮助用户高效搭建国产化测试与开发环境。

weixin_29323493的博客 355

iOS高级编程之多线程的使用场景深入探索

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

taylorwenzhan的博客 562

迈德威视相机调用( 基于 Linux系统+ OpenCV )

迈德威视相机调用( 基于 Linux系统+ OpenCV )前言一、登录迈德威视官网,下载官方SDK二、代码调用与视频帧处理( 基于 OpenCV )总结 前言     此博客记录了迈德威视工业相机在 Linux 系统下的代码调用及其环境配置,通过 OpenCV 对视频帧进行处理。   一、登录迈德威视官网,下载官方SDK      迈德威视官网 : http://www.mindvision.com.cn/     1. 进入官网后,在服务支持中选择软件下载。    2. 选择Linux系统S.

kkkkkk0729的博客 5680

第18届全国大学生智能汽车竞赛四轮车开源讲解【2.5】-- 图像处理实战:从二值化到边缘检测的工程优化

本文深入讲解了第18届全国大学生智能汽车竞赛四轮车开源项目中图像处理的核心实战技术。文章聚焦于二值化与边缘检测两大关键环节,详细对比了大津法与索贝尔算子的工程应用与优化策略,并分享了遮光、偏振片等物理抗干扰技巧,旨在帮助参赛者构建稳定高效的图像预处理流水线,为赛道识别奠定坚实基础。

weixin_29279047的博客 100

iOS 开发之多线程的应用场景

"code" class="objc">   通过下面一个例子来了解一下多线程的应用场景,我们可以通过点击按钮来开始或者暂停动画的播放,但是当我们点击另一个按钮时,   就会执行一个方法,在该方法中循环打印一个很大的数字,在打印过程中,再通过点击播放/暂停按钮来控制动画已经无法做到了   ,这时屏幕已经卡死,必须等待打印完成,才能控制动画的播放。如何既能打印又能控制动画的播放那,可以利用多线程

yebanfengdi的博客 1322

WandB本地部署踩坑指南:从Docker启动到License更新的完整流程(附常见错误解决方案)

本文详细介绍了Weights & Biases(WandB)机器学习实验管理平台的本地化部署全流程,涵盖从Docker环境搭建、许可证管理到常见错误排查的实战经验。针对企业级应用场景,文章还提供了性能优化、高可用架构设计及开源替代方案Trackio的评估与迁移策略,为构建安全、可控的内部实验追踪平台提供完整解决方案。

potato的博客 568

iOS中的多线程一般使用场景

在IOS开发中为提高程序的运行效率会将比较耗时的操作放在子线程中执行,iOS系统进程默认启动一个主线程,用来响应用户的手势操作以及UI刷新,因此主线程又叫做UI线程。 前面的Blog说明了NSThread以及GCD处理并发线程以及线程安全(线程锁@synchronized(){}),线程通信(从子线程向主线程传递值,刷新界面),接下来讨论线程的延迟与执行的单一化(唯一执行一次)。 1.延迟

jiandanjinxin的专栏 5551

无人机航拍实战:如何用Python代码精准计算目标地理坐标(附完整代码)

本文详细介绍了如何利用Python代码实现无人机航拍图像中目标点的精准地理位置计算。通过解析从像素坐标系到WGS84大地坐标系的完整转换链条,结合相机内参、无人机姿态与地球曲率处理,提供了可直接运行的实战代码,并重点分析了地理位置计算中的常见误差来源与应对策略,助力开发者解决实际项目中的定位漂移问题。

hh234的博客 357

基于ROS2 Humble与Livox Mid-360的双雷达点云融合实战解析

本文详细解析了基于ROS2 Humble与Livox Mid-360的双雷达点云融合实战方案。从环境搭建、驱动安装、双雷达配置、外参标定、时间同步到点云融合核心实现,全面介绍了技术要点与避坑指南,并提供了工程化部署与性能优化建议,助力开发者高效实现高精度点云合成应用。

ss78901的博客 1093

iOS多线程

iOS多线程

Unlimitedz的博客 778

PyTorch实战(7)——循环神经网络

本节介绍了循环神经网络 (RNN) 及其在序列数据处理中的应用。首先对比了卷积神经网络 (CNN) 与 RNN 的差异,指出 RNN 通过循环连接建模时序依赖关系。随后详细梳理了 RNN 的发展历程,包括基础 RNN、双向 RNN、LSTM、GRU 等变体的结构特点及改进动机,其中 LSTM 通过门控机制解决长程依赖问题,GRU 则进一步简化结构。接着通过 IMDb 情感分析实战,演示了如何使用 PyTorch 实现文本预处理、RNN 模型构建及训练评估流程,最后探讨了注意力机制如何提升 RNN 性能。

盼小辉丶的博客 1万+

【iOS】多线程基础

多线程的使用是十分重要的知识点,在后面具体项目中与其他第三方库结合的使用也很多,还需要继续学习并加以实践)

2401_86200358的博客 1005

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

【iOS】多线程学习

在写项目时,笔者发现需要很多GCD的内容,因此笔者决定先学习一下多线程,这样有利于后续对GCD的理解。笔者这篇文章简单总结了有关多线程的内容,后续更加深入学习将补充完善此篇博客。

2401_87841908的博客 1091

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

OA01-一个Demo展示iOS多线程技术的基本应用场景

最近在看iOS关于GCD、NSOperation多线程编程技术编程指南的时候写了个 小Demo,以7个小场景基本涵盖多线程技术的主流用法:其实多线程技术早在大学 读书的时候,基本思路就已经清晰了,不同操作系统的多线程实现也大同小异,iOS 平台下原理也是一样,关键就在与,能否熟练的、很顺畅的根据应用场景来选用相应 的多线程技术。

厚积薄发 2515

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

iOS 面试常问之多线程

本片围绕多线程全面展开叙述。 1、为什么要有多线程/多线程是用来干什么的? 2、多线程是什么? 3、如何创建多线程? 4、多线程在哪些情况下会使用/多线程使用场景? 5、三种多线程的优缺点? 6、线程同步 7、总结 1、为什么要有多线程/多线程是用来干什么的?   每个iOS应用程序都有个专门用来更新显示UI界面、处理用户的触摸事件的主线程,因此不能...

221

iOS之多线程---三种多线程技术

1.多线程的基本概念和用法 ①进程:每一个进程都一是一个应用程序,都有独立的内存空间。(一个程序也可以由多个进程)同一个进程中的线程共享内存中的存储空间和资源 ②线程: 每一个程序都有一个主线程,调用main来启动。 主线程的生命周期和应用程序绑定,程序退出时主线程停止。 任何可以阻塞主线程的任务不要再主线程中执行(比如访问网

Mcy的iOS学习站 538

iOS多线程开发——NSThread浅析

在IOS开发中,多线程的实现方式主要有三种,NSThread、NSOperation和GCD,我前面博客中对NSOperation和GCD有了较为详细的实现,可以参考《iOS多线程开发——NSOperation/NSOperationQueue浅析》《iOS多线程开发——GCD的使用与多线程开发浅析》。以及对于多线程中的同步异步,并行串行等概念,我在《GCD实践——串行队列/并发队列与iOS多线程

乞力马扎罗的雪CYF的博客 7948

关于iOS多线程,你看我就够了

在这篇文章中,我将为你整理一下 iOS 开发中几种多线程方案,以及其使用方法和注意事项。当然也会给出几种多线程的案例,在实际使用中感受它们的区别。还有一点需要说明的是,这篇文章将会使用 Swift 和 Objective-c 两种语言讲解,双语幼儿园。OK,let's begin! 概述 这篇文章中,我不会说多线程是什么、线程和进程的区别、多线程有什么用,当然我也不会说什么是串行、

銟麯的博客 1113

iOS多线程技术方案

iOS多线程技术方案 目录 一、多线程简介 1、多线程的由来2、耗时操作的模拟试验3、进程和线程4、多线程的概念及原理5、多线程的优缺点和一个Tip6、主线程7、技术方案二、Pthread---1、函数2、参数和返回值3、使用三、NSThread---1、创建一个新的线程2、线程的状态3、线程的属性四、互斥锁---1、访问共享资源引入问题!2、互斥锁介绍3、互斥锁原理4、互斥锁和自...

143

IOS多线程开发

本文转载至http://blog.youkuaiyun.com/davidsph/article/details/8171607 IOS的多线程,一般分为三种方式: 1,Thread;2,Cocoa operations;3,Grand Central Dispatch (GCD)(iOS4 才开始支持) 下面简单说明一下: 1:NSThread 创建方式主要有两种...

a1311010193的博客 91

iOS多线程编程的知识梳理

多线程编程也称之为并发编程,由于其作用大,有比较多的理论知识,因此在面试中也是受到面试官的青睐。在日常项目开发中,至少网络请求上是需要使用到多线程知识的,虽然使用第三方的框架比如AFNetworking进行网络请求比较简单,但是也是需要开发人员对多线程、block等知识有比较清晰的思路,才能在遇到问题的时候,能够有条理的找出问题并解决好。 本篇文章的定位是梳理下在iOS开发中多线...

CCCCCC1990的博客 439

iOS多线程开发系列之(二)NSOperation

上一篇我们简单的对iOS多线程开发系列(一)三种多线程办法进行对比性能和操作的复杂度,并认真介绍了NSThread的使用。 我们借助上一次的例子完全可以采取NSOperation方法进行实现NSOperation不具备封装操作的能力,必须使用它的子类: NSInvocationOperation NSBlockOperation 更简洁的Block实现方法,功能上与 NSInvocationOpe

小王的技术窝 1288

iOS 多线程总结

iOS多线程 在iOS中每个进程启动后都会建立一个主线程(UI线程),这个线程是其他线程的父线程。由于在iOS中除了主线程,其他子线程是独立于Cocoa Touch的,所以只有主线程可以更新UI界面(新版iOS中,使用其他线程更新UI可能也能成功,但是不推荐)。iOS中多线程使用并不复杂,关键是如何控制好各个线程的执行顺序、处理好资源竞争问题。常用的多线程开发有三种方式: 1.NSThread

Kun__kun的博客 601

iOS多线程总结

在这篇文章中,我将为你整理一下 iOS 开发中几种多线程方案,以及其使用方法和注意事项。当然也会给出几种多线程的案例,在实际使用中感受它们的区别。还有一点需要说明的是,这篇文章将会使用 Swift 和 Objective-c 两种语言讲解,双语幼儿园。OK,let's begin! 概述 这篇文章中,我不会说多线程是什么、线程和进程的区别、多线程有什么用,当然我也不会说什么是串

Lucas_Lin的博客 592
上一篇: iOS经典讲解之UICollectionView
下一篇: iOS经典讲解之多线程GCD的应用
刘新林
博客等级 码龄11年 72粉丝 61原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值