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

iOS ObjC:当应用程序在后台接收an获取时,为什么dispatch_sync on mainThread不工作?

当应用程序在后台接收和处理数据时,主线程可能处于休眠状态,无法执行dispatch_sync函数。dispatch_sync函数的作用是将任务添加到指定队列中,并等待任务完成后再继续执行后续代码。然而,在主线程休眠的情况下,dispatch_sync函数无法完成任务的执行,导致整个线程被阻塞。

这是由于iOS操作系统的一种机制所致,为了提高系统的性能和资源利用率,当应用程序进入后台时,系统会将主线程休眠以减少资源消耗。因此,如果在后台接收数据时使用dispatch_sync函数,就会出现主线程无法执行任务并等待的情况。

为了解决这个问题,可以采用dispatch_async函数替代dispatch_sync函数,将任务添加到主队列中。dispatch_async函数将任务异步地添加到主队列中执行,不会阻塞主线程。这样,即使主线程处于休眠状态,任务仍然可以在后台执行,保证应用程序的正常运行。

此外,也可以考虑使用其他线程来执行dispatch_sync函数,以避免主线程的阻塞。通过创建新的线程或使用全局并发队列,可以将任务添加到其他线程中执行,从而避免主线程休眠引起的问题。

总结起来,当应用程序在后台接收和处理数据时,主线程可能处于休眠状态,无法执行dispatch_sync函数。解决方法包括使用dispatch_async函数替代dispatch_sync函数,或将任务添加到其他线程中执行。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

求职笔记-iOS

(receiver, selector, arg1, arg2, …); 向一个对象发送消息objc_msgSend方法根据对象的isa指针找到对象的原来类,然后类的方法列表中查找selector...APP的生命周期 应用程序的状态 Not running未运行:程序没启动; Inactive未激活:程序在前台运行,未接收到事件; Active激活:程序在前台运行,接受到事件; Backgroud后台...:程序在后台运行,在后台停留一段时间后进入挂起状态(Suspended),如果有音乐、下载等特殊任务的程序可以长期处于Backgroud状态; Suspended挂起:程序在后台且不运行,收到系统内存不足的...还有一种:加载应用程序后台(在后台打开网易云音乐) 前面的start部分一致,但最终进入的不是Foreground状态,而是Background状态; Background长时间运行,会导致应用程序进入...总结 此篇的iOS知识点并不全面,仅仅是求职的一些笔记,后续接着写工作遇到的iOS相关问题,欢迎关注iOS开发随笔。

1.2K60

iOS开发君

前序 前段时间因为课程需要 , 我出了一套iOS考试试卷 想着VIP大家做得非常不错. 带着分享的精神也开源了出来 一套iOS底层试卷-我想和你分享 结果反响巨大!...很多靓仔靓女纷纷私聊我....大致分为以下两种: 1: Cooci 你这不是加剧行业内卷???...总分 200分 (不要问我为什么不是100分,诶...就是玩!!!!)...KVC - KVO - 多线程 - GCD - Block 下面我就贴出题目吧,如果你有时间的,不妨也拿笔本子测试一下,看看能做多少分,文章留言我会第一间发你答案!...staticSelf_ = weakSelf; } (滑动显示更多) 对 错 三、简单题 (每题 10分 合计 120分) 请把它当成一场面试,认真对待 希望大家耐心 切忌浮躁 (和谐学习 不急

32830
  • 多线程和GCD

    的所有任务都在线程中执行 比如使用酷狗播放音乐、使用迅雷下载电影,都需要在线程中执行 线程的串行 一个线程中任务的执行是串行的 如果要在一个线程中执行多个任务,那么只能一个一个地按顺序执行这些任务 也就是说,同一间内...,CPU只能处理一条线程,只有一条线程工作(执行) 多线程并发(同时)执行,其实是CPU快速地多条线程之间调度(切换),如果CPU调度线程的时间足够快,就造成了多线程并发执行的假象。...任务的取出遵循队列的FIFO原则:First in first out GCD路径iOS usr/include/dispatch/下查看头文件说明 GCD常用方法 执行任务 dispatch_sync...也就是说死锁的条件是因为dispatch_sync()方法等待Block执行完毕,而Block等待dispatch_sync()方法往下执行才能轮到它。...执行过之后,就需要把耗时操作得到的数据带回到主线程对UI进行刷新操作,这时就可以用如下代码。

    1.1K10

    iOS基础理论(三)

    _objc_msgForward是一个函数指针(和 IMP 的类型一样),是用于消息转发的:向一个对象发送一条消息,但它并没有实现的时候,_objc_msgForward会尝试做消息转发。...iOS应用程序里面,程序启动后会有一个如下的main()函数 intmain(intargc,char* argv[]) {  @autoreleasepool {returnUIApplicationMain...系统自动去释放--手动指定autoreleasepool Autorelease对象出了作用域之后,会被添加到最近一次创建的自动释放池中,并会在当前的 runloop 迭代结束释放。...子线程的 runloop 默认是工作,无法主动创建,必须手动创建。 自定义的 NSOperation 和 NSThread 需要手动创建自动释放池。...@autoreleasepool 自动释放池被销毁或者耗尽,会向自动释放池中的所有对象发送 release 消息,释放自动释放池中的所有对象。

    57030

    iOS_Effective Objective-C 20 编写高质量iOS与OS X代码的52个有效方法

    要点: 委托模式为对象提供了一套接口,使其可由此将相关事件告知其他对象 将委托对象应该支持的接口定义成协议,协议中把可能需要处理的时间定义成方法 某对象需要从另外一个对象中获取数据,可使用委托模式...iOS应用程序中,则是UIApplication对象,是程序启动创建的单例。 ​...ARC模式下,不会在finally块里加代码处理内存泄露问题,因为者需要添加大量的样板代码,会严重影响运行期的性能,即便在抛异常也如此。(而且添加的额外代码还会明显增加应用程序的大小。...及NSPurgeableData对象所占用内存被系统丢弃,该对象自身也会从缓存中移除 如果缓存使用得当,那么应用程序的响应速度就能提高。...iOS应用程序启动。load方法中使用其他类不安全的(如:其他类又用到了当前类,则无法正确加载了)。整个应用程序执行load方法都会阻塞(不要在里面等待锁/加锁)。

    1K40

    RunLoop

    之后会介绍一下 iOS 中,苹果是如何利用 RunLoop 实现自动释放池、延迟回调、触摸事件、屏幕刷新等功能的。...iOS应用程序里面,程序启动后会有一个如下的main()函数 int main(int argc, char * argv[]) { @autoreleasepool { return UIApplicationMain...比如,你可以通过 pthread_main_thread_np() 或 [NSThread mainThread] 来获取主线程;也可以通过 pthread_self() 或 [NSThread currentThread...线程刚创建并没有 RunLoop,如果你主动获取,那它一直都不会有。RunLoop 的创建是发生在第一次获取,RunLoop 的销毁是发生在线程结束。...withObject:nil waitUntilDone:NO modes:[self.runLoopModes allObjects]]; } [self.lock unlock]; } 需要这个后台线程执行任务

    83220

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

    多线程 撸面试题中,文中内容基本上都是搬运自大佬博客及自我理解,可能有点乱,喜勿喷!!! 主要以GCD为主 1、iOS开发中有多少类型的线程?...它是 BSD 系内核惯有功能 kqueue 的包装,kqueue 是 XUN 内核中发生各种事件应用程序编程执行处理的技术。...取消处理器中,可以执行内存和资源的释放工作; 一定要在 dispatch source 正常工作的情况下取消它。...表示 `NSOperation` 获取系统资源的优先级,默认为 `NSQualityOfServiceDefault`。...当我们设置它为 YES ,此时就将队列暂停了;同时将其设置为 NO ,此时队列恢复。 这里所谓的暂停,并不是设置之后立马暂停,而是执行当前正在执行的操作之后继续执行。

    4.5K50

    IOSIOS开发问题解决方法索引(一)

    假设任何别的方法获取的对象保持计数1,而且自动释放池中. 要想在当前执行范围外使用该对象,就必须保持它 3....通过通知,可以一定的条件下触发响应的事件。类似于Android中的广播机制(Broadcase Receiver),接收到通知(广播)后,便可执行指定的方法。...,通常为self,selector是接收到通知后要执行的操作,可以理解为操作事件,name是通知的名称,这里使用的是UIApplicationWillResignActiveNotification,意思是应用程序将要进入后台之前...通常对于UIApplication读者是没必要修改它的,只需要知道UIApplication接收系统事件即可,而如何编写代码来处理这些系统事件则 是程序员的工作。...,终止前会执行这个方法,通常可以在这里进行内存清理工作防止程序被终止 7、- (void)applicationSignificantTimeChange:(UIApplication*)application

    87340

    Objective-C RunLoop 详解

    之后会介绍一下 iOS 中,苹果是如何利用 RunLoop 实现自动释放池、延迟回调、触摸事件、屏幕刷新等功能的。...比如,你可以通过 pthread_main_thread_np() 或 [NSThread mainThread] 来获取主线程;也可以通过 pthread_self() 或 [NSThread currentThread...线程刚创建并没有 RunLoop,如果你主动获取,那它一直都不会有。RunLoop 的创建是发生在第一次获取,RunLoop 的销毁是发生在线程结束。...Mach 本身提供的 API 非常有限,而且苹果也鼓励使用 Mach 的 API,但是这些API非常基础,如果没有这些API的话,其他任何工作都无法实施。...withObject:nil waitUntilDone:NO modes:[self.runLoopModes allObjects]]; } [self.lock unlock]; } 需要这个后台线程执行任务

    1.5K80

    IOS开发高级系列】Runloop专题

    比如,你可以通过 pthread_main_np() 或 [NSThread mainThread] 来获取主线程;也可以通过 pthread_self() 或 [NSThread currentThread...线程刚创建并没有 RunLoop,如果你主动获取,那它一直都不会有。RunLoop 的创建是发生在第一次获取,RunLoop 的销毁是发生在线程结束。...Mach 本身提供的 API 非常有限,而且苹果也鼓励使用 Mach 的 API,但是这些API非常基础,如果没有这些API的话,其他任何工作都无法实施。...这就是为什么run loop可以做到让线程有工作的时候忙于工作,而没工作的时候处于休眠状态。...nil waitUntilDone:NO modes:[self.runLoopModes allObjects]];     }     [self.lock unlock]; }         需要这个后台线程执行任务

    42620

    《Effective Objective-C 》干货三部曲(三):技巧篇

    根据给定的键从某对象中获取相应的关联对象值: id objc_getAssociatedObject(id object, void *key) 3....这样一来,底层数据存储机制改变,只需修改此方法的代码就好,无需改动其他初始化方法。...匿名对象作为属性 设定某个类为自己的代理属性,可以声明代理的类,而是用id,因为成为代理的终点并不是某个类的实例,而是遵循了某个协议。...第39条:用handler块降低代码分散程度 下载网络数据,如果使用代理方法,会使得代码分布紧凑,而且如果有多个下载任务的话,还要在回调的代理中判断当前请求的类型。...CFArrayGetCount用来获取数组的长高度。 为什么要使用无缝桥接技术呢?因为有些OC对象的特性是其对应的CF数据结构不具备的,反之亦然。

    74010

    《Effective Objective-C 》干货三部曲(三):技巧篇

    根据给定的键从某对象中获取相应的关联对象值: id objc_getAssociatedObject(id object, void *key) 3....这样一来,底层数据存储机制改变,只需修改此方法的代码就好,无需改动其他初始化方法。...匿名对象作为属性 设定某个类为自己的代理属性,可以声明代理的类,而是用id,因为成为代理的终点并不是某个类的实例,而是遵循了某个协议。...第39条:用handler块降低代码分散程度 下载网络数据,如果使用代理方法,会使得代码分布紧凑,而且如果有多个下载任务的话,还要在回调的代理中判断当前请求的类型。...CFArrayGetCount用来获取数组的长高度。 为什么要使用无缝桥接技术呢?因为有些OC对象的特性是其对应的CF数据结构不具备的,反之亦然。

    76320

    细说 GCD(Grand Central Dispatch)如何用

    Main dispatch queue:全局可用的serial queue,应用程序主线程上执行任务。...并发队列:用来执行与UI无关的后台任务,dispatch_sync放在这里,方便等待任务完成进行后续处理或和dispatch barrier同步。dispatch groups放在这里也不错。...自定义顺序队列:顺序执行后台任务并追踪它。这样做同时只有一个任务执行可以防止资源竞争。dipatch barriers解决读写锁问题的放在这里处理。dispatch groups也是放在这里。...需要注意dispatch_barrier_async只自己创建的队列上有这种作用,全局并发队列和串行队列上,效果和dispatch_sync一样 //创建队列 self.isolationQueue...NSRecursiveLock:递归锁,可以一个线程中反复获取锁不会造成死锁,这个过程会记录获取锁和释放锁的次数来达到何时释放的作用。

    2.1K30

    iOS-多线程详解

    线程的串行 1个线程中任务的执行是串行的 如果要在1个线程中执行多个任务,那么只能一个一个地按顺序执行这些任务 也就是说,同一间内,1个线程只能执行1个任务 5....多线程原理 同一间,CPU只能处理1条线程,只有1条线程工作(执行),多线程并发(同时)执行,其实是CPU快速地多条线程之间调度(切换),如果CPU调度线程的时间足够快,就造成了多线程并发执行的假象...那么多个线程访问同一块资源,很容易引发数据错乱和数据安全问题。 ?...安全隐患分析 通过上图我们发现,线程A访问数据并对数据进行操作的同时,线程B访问的数据还是没有更新的数据,线程B同样对数据进行操作,两个线程结束返回,就会发生数据错乱的问题。...将封装操作加入主队列 // 也可以获取封装操作对象 直接添加操作到队列中 //[queue addOperationWithBlock:^{ // 操作 //}];

    2.1K90

    iOS_多线程一:GCD+混搭测试

    以优化应用程序支持多核心处理器和其他的对称多处理系统的系统。  •GCD属于函数级的多线程,性能更高,功能也更加强大。  •它首次发布Mac OS X 10.6 ,iOS 4及以上也可用。...•分发队列:GCD以队列的方式进行工作,例如FIFO。  •GCD会根据分发队列的类型,创建合适数量的线程执行队列中的任务。...当你创建多个Serial queue,虽然它们各自是同步执行的,但Serial queue与Serial queue之间是并发执行的。...,只执行一次 dispatch_sync()   将任务添加到队列中,block执行完,下面代码不会执行 dispatch_async_f()  将任务添加到队列中,任务是函数非block 一些使用案例...,顺序执行,阻塞 7、同步-主串行 // 例:之前百度面试遇到的题 NSLog(@"1"); dispatch_sync(dispatch_get_main_queue(), ^{ // 串行

    45120

    推送-推送原理性说明

    APNS推送通知的详细工作流程下面这张图是说明APNS推送通知的详细工作流程: 根据图片我们可以概括一下: 应用程序注册APNS消息推送。...iOS从APNS Server获取devicetoken,应用程序接收device token。 应用程序将device token发送给程序的PUSH服务端程序。...推送通知本身是 iOS 系统的行为,所以 App 没有运行(没有在前台也没有在后台)的时候:仍然能够推送及接收(通知中心通知、顶部横幅、刷新 App 右上角的小圆点即 badge [以下简称角标] 等都会由系统来控制和展示...如果注册成功,则可以 AppDelegate.m 的如下方法中获取到 deviceToken,它是对 该手机+该App 组合的一个唯一标识,使用远程推送,只需将推送消息发给指定的 deviceToken...处于后台:可通过didReceiveRemoteNotification:fetchCompletionHandler:获取通知内容 // 获取情况中与普通推送的唯一不同点,此时 iOS 系统允许开发者

    3.8K20

    iOS 银联支付开发流程

    (3)银联后台接收订单信息并检查通过后,生成对应交易流水号(即TN),并回复至商户后台(应答要素:交易流水号等);   (4)商户后台接收到交易流水号(TN),将交易流水号返回至客户端;   (5)...;   (9)支付控件显示支付结果并将支付结果返回至客户端;   此处备注:我们是通过后台获取订单,我们可以根据商品id等信息通过后台接口获取订单信息,对订单支付流程的签名加密过程后台完成。...#import "UPPaymentControl.h" 调起支付的方法中代码如下: //获得的tn不为空,调用支付接口 if (tn !...4.6 支付结果回调 支付成功之后,支付结果返回,需要获取url,需要在Appdelegate中完成 Appdelegate里面,首先增加头文件引用。...3.控件界面无限加载,请参考控件使用指南iOS “添加SDK包“里“添加-ObjC宏”,特别注意大小写不要弄混。

    3.5K30

    ios 多线程你需要了解的

    了解多线程之前首先要了解一下几个概念 进程 进程是指在系统中正在进行的一个应用程序;每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内。...多线程原理 单核CPU同一间内能处理1条线程,多线程并发执行,其实是CPU快速地多条线程之间调度。如果CPU调度线程的时间足够快,就造成了多线程并发执行的假象。...; }); 多线程ios中的运用 ?...串行队列: 创建队列,传参数DISPATCH_QUEUE_SERIAL表示创建串行队列。任务会一个一个地执行,只有前一个任务执行完成,才会继续执行下一个任务。...并发队列: 创建队列,传参数DISPATCH_QUEUE_CONCURRENT表示创建并发队列。并发队列会尽可能多地创建线程去执行任务。

    37330

    iOS_Extension、Category、load、initialize

    ,可以将不同的功能分在不同的分类中实现,进而可以按需引入不同的Category,优化代码;有助于提高可维护性,简化单个文件的管理 需要扩展系统类。...四、+initialize 定义: ​ 该类第一次接收到消息之前(惰性)以线程安全(加锁)的方式调用,其他的消息会等待initialize完成。系统自动调用(无须手动调用)。...,特别是获取其他类需要的锁代码,容易导致死锁!...需要扩展的方法与原方法同名,并且需要调用父类的同名方法,则需要用继承;(因为分类的同名方法会覆盖原方法的实现,进而访问不到原方法。) ---- 4、系统是怎么实现Category的?...具体过程可以看这篇文章:iOS底层原理总结 - Category的本质 5、Category为什么只能加方法,而不能加属性? ​

    51300
    领券