首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

iOS:当应用程序状态为UIApplicationStateBackground时,为什么dispatch_async不能运行到主线程?

在iOS中,当应用程序状态为UIApplicationStateBackground时,dispatch_async不能运行到主线程的原因是因为在后台状态下,主线程是被挂起的,无法执行任何任务。这是为了保证后台任务的执行效率和系统资源的合理利用。

在iOS中,应用程序状态分为三种:UIApplicationStateActive、UIApplicationStateInactive和UIApplicationStateBackground。当应用程序进入后台状态(UIApplicationStateBackground)时,系统会限制应用程序的资源使用,以保证系统的稳定性和性能。

在后台状态下,应用程序只能执行一些特定的任务,例如音乐播放、位置更新、后台下载等。为了执行这些任务,iOS提供了一些特定的后台模式,例如Background Fetch、Remote Notifications、Background Transfer Service等。这些后台模式允许应用程序在后台状态下继续执行一些特定的任务,但是仍然受到系统资源的限制。

由于主线程被挂起,无法执行任务,所以dispatch_async不能运行到主线程。如果需要在后台状态下执行任务,可以使用其他的线程或队列来执行,例如使用dispatch_queue_t来创建一个后台队列,并使用dispatch_async将任务添加到该队列中。

腾讯云相关产品和产品介绍链接地址:

  • 腾讯云云服务器(CVM):https://cloud.tencent.com/product/cvm
  • 腾讯云云原生容器服务(TKE):https://cloud.tencent.com/product/tke
  • 腾讯云云数据库MySQL版(TencentDB for MySQL):https://cloud.tencent.com/product/cdb_mysql
  • 腾讯云云存储(COS):https://cloud.tencent.com/product/cos
  • 腾讯云人工智能(AI):https://cloud.tencent.com/product/ai
  • 腾讯云物联网(IoT):https://cloud.tencent.com/product/iot
  • 腾讯云移动开发(移动推送、移动分析、移动测试等):https://cloud.tencent.com/product/mobile
  • 腾讯云区块链(BCS):https://cloud.tencent.com/product/bcs
  • 腾讯云元宇宙(Tencent XR):https://cloud.tencent.com/product/xr
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

iOS线程编程

OS X和iOS的核心XNU内核在发生操作系统事件(如每隔一定时间,唤起系统调用等情况)会切换执行路径。...换句话说,一个异步过程调用发出后,调用者不会立刻得到结果。而是在调用发出之后,被调用者通过“状态”、“通知”、“回调”三种途径通知调用者。...像这样在Concurrent Dispatch Queue中执行处理,执行顺序会根据处理内容和系统状态发生改变。     ...为了说明线程分配原理,这里假设线程4,实测iOS11线程数可达20个,所以想测试的同学,在并发队列中必须追加20个以上的任务      对于Concurrent Dispatch Queue来说,不管生成多少...:%@",[NSThread currentThread]); // 当你在 group 的任务没有完成的情况下不能做更多的事,阻塞当前线程等待 group 完工 dispatch_group_wait

87960

iOS线程编程

OS X和iOS的核心XNU内核在发生操作系统事件(如每隔一定时间,唤起系统调用等情况)会切换执行路径。...换句话说,一个异步过程调用发出后,调用者不会立刻得到结果。而是在调用发出之后,被调用者通过“状态”、“通知”、“回调”三种途径通知调用者。...像这样在Concurrent Dispatch Queue中执行处理,执行顺序会根据处理内容和系统状态发生改变。     ...为了说明线程分配原理,这里假设线程4,实测iOS11线程数可达20个,所以想测试的同学,在并发队列中必须追加20个以上的任务      对于Concurrent Dispatch Queue来说,不管生成多少...:%@",[NSThread currentThread]); // 当你在 group 的任务没有完成的情况下不能做更多的事,阻塞当前线程等待 group 完工 dispatch_group_wait

57630

iOS 面试之多线程

1.进程与线程 进程: 1.进程是一个具有一定独立功能的程序关于某次数据集合的一次运行活动,它是操作系统分配资源的基本单元. 2.进程是指在系统中正在运行的一个应用程序,就是一段程序的执行过程,我们可以理解手机上的一个...如果semaphore计数大于等于1,计数-1,返回,程序继续运行。如果计数0,则等待。...死锁是由于多个线程(进程)在执行过程中,因为争夺资源而造成的互相等待现象,你可以理解了。...不可剥夺条件 : 指进程已获得的资源,在未使用完之前,不能被剥夺,只能在使用完由自己释放。...在iOS7.0的时候,使用GCD系统通常只能开58条线程iOS8.0以后,系统可以开启很多条线程,但是实在开发应用中,建议开启线程条数:35条最为合理。

66420

浅谈 iOS NSNotification

NSNotificationCenter 是基于观察者模式设计的,不能应用程序进程通信, NSNotificationCenter 接收到消息之后会根据内部的消息转发表,将消息发送给订阅者;它可以向应用任何地方发送和接收通知...NSPostingStyle) { NSPostWhenIdle = 1, NSPostASAP = 2, NSPostNow = 3 }; NSPostWhenIdle:空闲发送通知,运行循环处于等待或空闲状态...其实,从 iOS 9 开始,即使不移除观察者对象,程序也不会出现异常。这是为什么呢?我们先了解一下,为什么 iOS 9 之前需要手动移除观察者对象。...我们仍然是像之前一样去注册一个通知的观察者, Notification 到达,先看看 post 这个 Notification 的线程是不是我们所期望的线程,如果不是,就将这个 Notification...如果接收线程的run loop在Mach消息到达没有运行,则内核保持该消息,直到下一次进入run loop。

1.3K30

锁的使用以及底层原理

0800 004-NSCondition[8242:1558006] 线程 1 分析如下: 首先在主线程依次添加了三个任务全局队列,这三个任务的优先级由高低依次线程1>线程3>线程2。...首先执行线程1 的时候,由于条件不符合(初始条件是2,而线程1中的条件是1),因此线程1会进入waiting状态,并且释放当前的条件锁。...一次只有一个线程可以占有写模式的读写锁, 但是可以有多个线程同时占有读模式的读写锁. 正是因为这个特性,读写锁是写加锁状态, 在这个锁被解锁之前, 所有试图对这个锁加锁的线程都会被阻塞。...读写锁在读加锁状态, 所有试图以读模式对它进行加锁的线程都可以得到访问权, 但是如果线程希望以写模式对此锁进行加锁, 它必须直到所有的线程释放锁。...通常, 读写锁处于读模式锁住状态, 如果有另外线程试图以写模式加锁, 读写锁通常会阻塞随后的读模式锁请求, 这样可以避免读模式锁⻓期占用, 而等待的写模式锁请求⻓期阻塞。

64220

iOS-UIApplication详解iOS-UIApplication详解

UIApplicationMain函数了解程序启动的过程 根据传递的类名创建UIApplication对象,这是第一个对象 创建UIApplication代理对象,并给UIApplicaiton对象设置代理 开启运行循环...联网指示器显示效果图 管理状态栏 从iOS7开始,系统提供了2种管理状态栏的方式 a.通过UIViewController管理(每一个UIViewController都可以拥有自己不同的状态栏)在iOS7...} b.通过UIApplication管理(一个应用程序状态栏都由它统一管理)如果想利用UIApplication来管理状态栏,首先得修改Info.plist的设置,添加选中行,并设置NO即可,这篇文章中有详细介绍...iOS中用application 来管理电池栏状态 ?...判断程序运行状态 //判断程序运行状态 /* UIApplicationStateActive, UIApplicationStateInactive,

1.6K70

iOS 开发--怎样高效的使用多线程

这里的 PC (Program Counter) 指向的是当前的指令地址,通过 PC 的更新来运行我们的程序,一个线程同一刻只能执行一条指令。...二、多线程的优化思路 在移动端开发中,因为系统的复杂性,开发者往往不能期望所有线程都能真正的并发执行,而且开发者也不清楚 XNU 何时切换内核态线程、何时进行线程调度,所以开发者要经常考虑线程调度的情况...三、关于“锁” 多线程会带来线程安全问题,原子操作不能满足业务,往往需要使用各种“锁”来保证内存的读写安全。...在读取锁失败线程有可能有两种状态: 空转状态线程执行空任务循环等待,锁可用时立即获取锁。 挂起状态线程挂起,锁可用时需要其他线程唤醒。... A 获取锁访问共享资源,B 尝试获取锁,那么 B 就会进入忙等状态,忙等时间越长对 CPU 资源的占用越大;而由于 A 的优先级低于 B,A 无法与高优先级的线程争夺 CPU 资源,从而导致任务迟迟完成不了

94140

iOS 如何高效的使用多线程

这里的 PC (Program Counter) 指向的是当前的指令地址,通过 PC 的更新来运行我们的程序,一个线程同一刻只能执行一条指令。...CPU 核心数量是有限的,也就是说一个设备并发执行的线程数量是有限的,线程数量超过 CPU 核心数量,一个 CPU 核心往往就要处理多个线程,这个行为叫做线程调度。...二、多线程的优化思路 在移动端开发中,因为系统的复杂性,开发者往往不能期望所有线程都能真正的并发执行,而且开发者也不清楚 XNU 何时切换内核态线程、何时进行线程调度,所以开发者要经常考虑线程调度的情况...三、关于“锁” 多线程会带来线程安全问题,原子操作不能满足业务,往往需要使用各种“锁”来保证内存的读写安全。...在读取锁失败线程有可能有两种状态: 空转状态线程执行空任务循环等待,锁可用时立即获取锁。 挂起状态线程挂起,锁可用时需要其他线程唤醒。

1.7K30

iOS_多线程五:基础的9种锁,扩展12种使用

加锁后,任何其他试图加锁的线程会被阻塞,直到当前线程解锁。 解锁,如果有1个以上的线程阻塞,那么所有该锁上的线程变为就绪状态,第一个就绪的加锁,其他的又进入休眠。...一个线程解锁之前又锁上,将导致死锁。    尝试解除其他线程上的锁,结果不可预测。    尝试解除一个未锁定的锁,结果不可预测。  ...一个线程尝试重新锁定一个还未解开的锁,将会返回一个错误。    尝试解除其他线程上的锁,将会返回一个错误。    尝试解除一个未锁定的锁,将会返回一个错误。  ..., 加锁成功 // [cLock unlockWithCondition:n]; // 解锁, 并设置标志位 // [cLock lockWhenCondition:n]; // 标志位n加锁...参数只是一个标识符,多个异步线程传入的参数一致时会触发锁机制,不一致,则不会阻塞。

73910

iOS 应用使用位置信息

iOS 应用使用位置信息 最近要在 iOS 应用中添加位置信息, 需要满足的需求如下: 应用在前台能够获取位置信息; 通过切换、 Home 按键将应用切换到后台,停止获取位置信息; 应用程序在前台运行...在锁屏情况下继续更新 GPS 信息 程序运行时, 用户直接锁定屏幕, 会调用 AppDelegate 的 DidEnterBackground 方法, 但是对于 iOS 应用来说, 用户切换程序或者点击...Home 按钮是, 也会调用这个函数, 这两种操作的区别在当前应用实例(UIApplication)的状态, 当用户切换程序或者点击 Home 按钮, 应用的状态UIApplicationStateBackground..., 状态 UIApplicationBackground 是才停止更新位置, 代码如下: public override void DidEnterBackground(UIApplication...应用添加后台位置权限 要真正能在锁屏状态下继续更新位置, 需要修改 info.plist ,增加后台位置权限。

74410

线程(二):GCD

1、添加任务队列(同步、异步): dispatch_sync: 同步添加,将指定的任务block同步追加到queue中,在追加的block结束之前,dispatch_sync会一直等待; 如果在主线程上执行同步任务...系统对于一个Serial Dispatch Queue就只生成并使用一个线程,但是如果生成过多的线程,会导致消耗大量的内存,引起大量的上下文切换,大幅度降低系统的响应性能,因此只在为了避免多个线程更新相同的资源导致数据竞争使用...Concurrent Dispatch Queue(并行队列): 不等待现在执行中处理结束,可以并行执行多个处理,并行处理的处理数量取决于当前系统状态,生成所需的线程执行处理,处理结束,应当执行的处理数减少时...,XNU内核会结束不再需要的线程,因此想并行执行不发生数据竞争等问题处理使用并行队列,有效管理线程,不会出现太多线程。...,从queue检出一个barrier,是等待其他的block都执行完毕再执行barrier,此时不会并发执行其他的block,直到该barrier执行完毕。

40420

深入理解GCD

虽然许多线程可以同时读取 NSMutableArray 的一个实例而不会产生问题,但一个线程正在读取让另外一个线程修改数组就是不安全的。你的单例在目前的状况下不能预防这种情况的发生。...在写者打扰的情况下,要确保线程安全,你需要在 concurrentPhotoQueue 队列上执行读操作。既然你需要从函数返回,你就不能异步调度队列,因为那样在读者函数返回之前不一定运行。... Dispatch Group 中没有任何任务,它就会执行其代码,那么 completionBlock 便会运行。...这意味着任何来自前一个测试的异步代码会在下一个测试运行时继续运行。 网络代码通常是异步的,因此你不能在执行网络获取阻塞主线程。...默认的,所有源都初始暂停状态。如果你要开始监控事件,你必须告诉源对象恢复活跃状态。 编译并运行应用;在调试器里暂停并立即恢复应用,查看控制台,你会看到这个来自黑暗艺术的函数确实可以工作。

1.4K10

iOS开发中权限再度梳理

前言 上篇文章iOS开发中的这些权限,你搞懂了吗?介绍了一些常用权限的获取和请求方法,知道这些方法的使用基本上可以搞定大部分应用的权限访问的需求。...但是,这些方法并不全面,不能涵盖住所有权限访问的方法。 So,笔者在介绍一下剩下的几种权限的访问方法和一些使用上的注意事项,希望能给大家的开发过程带来一丝便利。...,若当前状态NotDetermined(未确定),此时,需要调用系统提供的请求权限方法,同时也是触发系统弹窗的所在点; 该权限涉及的类** SFSpeechRecognizer**,具体代码如下:...UI的话,需要将对应的方法置于主线程中进行,笔者将上述方法默认在主线程中进行。...文件,若没有打开该开关,项目运行时会报错。

69840

iOS开发中的这些权限,你搞懂了吗?

前言 上篇文章iOS开发中的这些权限,你搞懂了吗?介绍了一些常用权限的获取和请求方法,知道这些方法的使用基本上可以搞定大部分应用的权限访问的需求。...但是,这些方法并不全面,不能涵盖住所有权限访问的方法。 So,笔者在介绍一下剩下的几种权限的访问方法和一些使用上的注意事项,希望能给大家的开发过程带来一丝便利。...,若当前状态NotDetermined(未确定),此时,需要调用系统提供的请求权限方法,同时也是触发系统弹窗的所在点; 该权限涉及的类** SFSpeechRecognizer**,具体代码如下:...UI的话,需要将对应的方法置于主线程中进行,笔者将上述方法默认在主线程中进行。...文件,若没有打开该开关,项目运行时会报错。

1.9K20

iOS线程总结

了解多线程,首先我们需要了解以下知识 进程 ●进程是指在系统中正在运行的一个应用程序,就是一段程序的执行过程,我们可以理解手机上的一个app。...●每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内,拥有独立运行所需的全部资源。 线程 ●程序执行流的最小单元,线程是进程中的一个实体.... group 中未执行完毕任务数0的时候,才会使dispatch_group_wait解除阻塞,以及执行追加到dispatch_group_notify中的任务。...(2) 请求与保持条件:一个进程因请求资源而阻塞,对已获得的资源保持不放。 (3) 不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。...同步对于任务是立刻执行的,那么把任务放进主队列,它就会立马执行,只有执行完这个任务,viewDidLoad才会继续向下执行。

74950

iOS线程:『GCD』详尽总结

它主要用于优化应用程序以支持多核处理器以及其他对称多处理系统。它是一个在线程池模式的基础上执行的并发任务。在 Mac OS X 10.6 雪豹中首次推出,也可在 iOS 4 及以上版本使用。...6.5.1 dispatch_group_notify 监听 group 中任务的完成状态所有的任务都执行完成后,追加任务 group 中,并执行任务。...在 Dispatch Semaphore 中,使用计数来完成这个功能,计数0等待,不可通过。计数1或大于1,计数减1且不等待,可通过。...6.6.2 Dispatch Semaphore 线程安全和线程同步(线程加锁) 线程安全:如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。...线程同步:可理解线程 A 和 线程 B 一块配合,A 执行一定程度要依靠线程 B 的某个结果,于是停下来,示意 B 运行;B 依言执行,再将结果给 A;A 再继续操作。

97670

阿里、字节:一套高效的iOS面试题( 多线程 GCD底层原理篇)

系统将在具有后台状态线程(setThreadPriority)上运行该队列上的任务, /// (磁盘 I/O 收到限制,线程的调度优先级被设置最低值) #define DISPATCH_QUEUE_PRIORITY_BACKGROUND...运行过程中,若内部值负数,则这个值的绝对值便是正在等待资源的线程数。 dispatch_semaphore_wait; > 信号量 -1。...就是一段代码不能被并发执行,也就是,两个线程不能同时执行这段代码。 自旋锁:线程反复检查锁变量是否可用。在这个过程中,线程一直保持运行,所以是一种 忙碌等待。...被分配到资源,条件锁解开,任务程继续进行。条件变量总是与互斥量一同出现, 递归锁:递归锁可以被一个线程多次 lock,且不会造成死锁问题。...线程对该信号量完成一次 wait,计数值 -1;线程对该信号量完成一次 signal(release),计数值 +1。计数值 0 或小于 0 线程必须等待该信号量知道其数值大于 0。

4.4K50

屏幕成像原理以及FPS优化Tips

视频控制器还未读取完成,即屏幕内容刚显示一半时,GPU 将新的一帧内容提交到帧缓冲区并把两个缓冲区进行交换后,视频控制器就会把新的一帧数据的下半段显示屏幕上,造成“画面撕裂”现象,我们称之为“screen...为什么我的游戏会出现画面撕裂 可能你还会问,为什么我的显卡和显示器配置都很高,玩游戏还是会存在画面撕裂的现象呢?...注意, VSync 信号发出,如果 GPU/CPU 正在生产帧数据,此时不会发生复制操作。...这里特别说一下 CALayer:CALayer 内部并没有属性,调用属性方法,它内部是通过运行时 resolveInstanceMethod 对象临时添加一个方法,并把对应属性值保存到内部的一个...(UIImage只有在显示的时候才会解码,而这个操作一般是在主线程,所以容易造成卡顿) 说明:[UIImage imageNamed:@"xxx"]方式加载进来的图片是不能直接显示屏幕上的,imageNamed

9.5K73

面试iOS 机会在自己手中

对于语句NSString *obj = [[NSData alloc] init]; obj在编译运行时分别什么类型的对象?...答: 编译是NSString的类型;运行时是NSData类型的对象 6. Object C中创建线程的方法是什么?如果在主线程中执行代码,方法是什么?如果想延时执行代码、方法又是什么?...调用performSelector:onThread:,实际上其会创建一个 Timer 加到对应的线程去,同样的,如果对应线程没有 RunLoop 该方法也会失效。 *9....NSRunLoopCommonModes(kCFRunLoopCommonModes) 在编程中:如果我们把一个NSTimer对象以NSDefaultRunLoopMode(kCFRunLoopDefaultMode)添加到运行循环中的时候...所以就会影响NSTimer不准的情况。 PS:DefaultMode 是 App 平时所处的状态,rackingRunLoopMode 是追踪 ScrollView 滑动状态

53451
领券