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

在while循环中使用perform(afterDelay:)会导致逻辑错误?

在while循环中使用perform(afterDelay:)可能会导致逻辑错误。perform(afterDelay:)是一种延迟执行方法,它会在指定的延迟时间后将指定的代码块添加到主线程的运行循环中执行。然而,在while循环中使用perform(afterDelay:)时,由于循环的执行速度非常快,perform(afterDelay:)方法可能无法按预期的延迟时间执行。

这种情况下,循环会在短时间内迅速执行多次,而perform(afterDelay:)方法添加的代码块则会在循环结束后才开始执行。由于代码块的执行是延迟的,循环可能已经执行完毕,导致代码块无法按照预期的顺序执行,从而导致逻辑错误。

为了避免这种问题,可以考虑使用其他方式来实现延迟执行的需求,例如使用GCD的dispatch_after方法或者使用定时器来实现延迟执行。这些方法可以更精确地控制代码块的执行时间,避免在循环中出现逻辑错误。

总结: 在while循环中使用perform(afterDelay:)可能会导致逻辑错误,因为perform(afterDelay:)方法的延迟执行机制无法适应循环的快速执行。为了避免这种问题,可以考虑使用其他方式来实现延迟执行的需求,例如使用GCD的dispatch_after方法或者使用定时器。

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

相关·内容

Java 中为什么不推荐在 while 循环中使用 sleep()

前言最近逛 CSDN 看到一篇文章,文章大意是说为什么在循环中不推荐使用 sleep 操作,原因在于线程挂起和唤醒会有很大的性能消耗,并推荐使用 Timer 及 ScheduledExecutorService...sleep 可能会导致忙等待 // 如 FLAG 变量状态未改变 那么线程可能一直循环,并不断进行线程挂起和唤醒原因是否正确主要原因和原文博主所说有很大的关系但不完全正确:我们都知道 Java 线程实际对应着操作系统中的一个线程...比如微服务体系中,客户端上报实例状态,或者服务端检测客户端状态都会使用定时轮询的机制。...比如一些用户登录场景,当用户登录状态改变时,发送登录事件进行后续处理,比如登录通知等等等待和唤醒等待和唤醒机制一般适用于等待时间较长的场景,因为等待和唤醒是一个性能消耗比较大的操作;在等待时间不是很长的场景可以使用轮询机制...在 Java AQS 等待获取锁和线程池任务为空等待新任务时,会使用等待和唤醒操作轮询机制 和 等待和唤醒 一般会结合使用,避免线程频繁的挂起和唤醒。

1.6K30

【iOS 开发】延迟执行方法小总结

当需要实现类似“轮询”这种操作的时候,我们可能会希望有一个“被放缓了的” for 循环 —— 即当某次操作执行后,稍等一下再去执行下一次操作。...这时有几种方法可以供我们使用,来实现这种效果,下面对比总结一下。 ---- perform(_ aSelector: Selector, with anArgument: Any?..., afterDelay delay: TimeInterval) extension NSObject { open func perform(_ aSelector: Selector, with..., afterDelay delay: TimeInterval, inModes modes: [RunLoopMode]) open func perform(_ aSelector: Selector...神奇而伟大的 GCD 这里就不多做介绍了,有太多文章讲解它了 优点:执行的是闭包,可以随意传参 缺点:一旦开启,无法取消,只能提前在闭包里面添加严谨的逻辑判断了

1.3K20
  • iOS_多线程四:NSThread + performSelector + 总结

    在子线程中未执行 2、实现:多次点击, 只执行最后一次 三、需要手动加锁(线程同步)(缺点) 三、多线程总结 Prioritize Work with Quality of Service Classes...dateWithTimeIntervalSinceNow:3]]; [NSThread exit]; // 立即终止主线程之外的所有线程(包括正在执行任务的) // 注意:需要在掌控所有线程状态的情况下调用此方法,否则可能会导致内存问题...在子线程中未执行 - (void)afterDelayNowork { // 模拟子线程里执行 afterDelay 方法 dispatch_async(dispatch_get_global_queue...在子线程中不work: 因为默认是在当前RunLoop中添加计时器延时执行,而子线程的RunLoop默认不开启,因此不work 2....会让当前函数后面的代码先执行: 因为该方法是异步的,会先入栈,等线程空闲了才执行 3. runloop run方法后代码不执行: 解决方法1:在执行完任务后需要用CF框架的方法结束当前loop 解决方法

    51430

    RunLoop数据结构、RunLoop的实现机制、RunLoop的Mode、RunLoop与NSTimer和线程

    (不是简单的for循环或while循环) //无限循环代码模式(伪代码) int main(int argc, char * argv[]) { BOOL running = YES...如果线程当前正在处理繁重的任务,就有可能导致Timer本次延时,或者少执行一次)。...在用户态调用 mach_msg_trap()时会切换到内核态;内核态中内核实现的mach_msg()函数会完成实际的工作。...原因是如果是带afterDelay的延时函数,会在内部创建一个 NSTimer,然后添加到当前线程的RunLoop中。也就是如果当前线程没有开启RunLoop,该方法会失效。...即在调用RunLoop的run方法后,由于其mode中没有添加任何item去维持RunLoop的时间循环,RunLoop随即还是会退出。

    64040

    iOS开发-RunLoop

    RunLoop 从字面意思来看:跑圈、运动循环 基本用法:保持程序持续运行、处理App中的各种事件(触摸事件、定时器事件、SEL等等) 为什么需要它:节省CPU资源、 提高性能 如果没有RunLoop...; } return 0; } 有Runloop后,程序就相当于一直在做循环 在这个循环内部不断地处理各种任务(比如Source、Timer、Observer) int main(int..., const char * argv[]) { BOOL running = YES; do{ // 执行各种任务,处理各种时间 }while...进入其他模式,这个定时器就不会工作 [[NSRunLoop currentRunLoop] addTimer:time forMode:NSDefaultRunLoopMode]; // 定时器会跑在标记为...Paste_Image.png RunLoop处理逻辑,整理:自动释放池的生命周期 RunLoop在进入这个 kCFRunLoopBeforeWaiting时,会对自动释放池销毁 ?

    83410

    一个循环动画引起的内存泄露问题总结

    第二个问题,因为 performSelector 这个方法内部是有一个 timer,该 timer 会持有 self,self 也持有该 timer,造成循环引用,所以 dealloc 就一直不调用了。...解决方法也有多个,比如说在 viewWillDisappear 里取消掉该 perform 的方法(之后记得在 viewWillAppear 重新启动动画): [NSObject cancelPreviousPerformRequestsWithTarget...这里就使用多一个关键帧动画操作其 opacity 参数实现隐藏 1 秒。...总结 使用 performSelector 来延时执行,要记得其内部是有一个 timer 的,会持有 self,所以要注意循环引用的问题,虽然在最后会自动释放,但是这样也会造成延时释放或是上述重复调用导致...我们 APP 里已经接入该库,在 Debug 模式中检测到类似的内存泄露就弹框或者 Assert,及时地发现和解决。 QQ音乐团队诚聘测试、研发。

    2.4K20

    编码篇-ARC下的内存泄漏

    循环引用 block引起的循环引用。 某个类将block作为自己的属性变量,然后该类在block的方法体里面又使用了该类本身;相互持有,导致都释放不了。...block不是self的属性或者变量时,在block内使用self不会循环引用; 像这样的方法中调用self,不会引起,但是属性的形式中调用self就会以 [self.myTest doSomeTest...我遇到过一种情况,就是给UITableViewCell设置block属性响应事件,在block中强引用了self, 导致self->tableView->cell->self形成循环。...有时候随着代码量的增大,逻辑的负责,很容易形成一个很大的循环引用,最后造成内存泄漏。...下面的代码在书写的时候Xcode是不会报任何错误和警告的。但是实际上已经形成了循环引用。造成了内存泄漏。

    1.7K20

    iOS多线程:『RunLoop』详尽总结RunLoop

    do { // 执行各种任务,处理各种事件 // ...... } while (running); return 0; } 从上边可看出,程序一直在do-while...循环中执行,所以UIApplicationMain函数一直没有返回,我们在运行程序之后程序不会马上退出,会保持持续运行状态。...官方RunLoop模型图 从上图中可以看出,RunLoop就是线程中的一个循环,RunLoop在循环中会不断检测,通过Input sources(输入源)和Timer sources(定时源)两种来源等待接受事件...(后边会用到) 其中kCFRunLoopDefaultMode、UITrackingRunLoopMode、kCFRunLoopCommonModes是我们开发中需要用到的模式,具体使用方法我们在 2.3...这下我们就可以来理解RunLoop的运行逻辑了。 下边上一张之前提到的文章中博主提供的运行逻辑图(来源:http://blog.ibireme.com/2015/05/18/runloop/) ?

    2.1K50

    iOS PerformSelector 遗漏问题

    当我们在使用以下方法时: [obj performSelector:@selector(play)]; [obj performSelector:@selector(play:) withObject:...其实说到对时间方面的处理在项目中经常用到的是NSTimer:当一个NSTimer注册到Runloop后,Runloop会重复的在相应的时间点注册事件,当然Runloop为了节省资源并不会在准确的时间点触发事件...而performSelector:withObject:afterDelay:其实就是在内部创建了一个NSTimer,然后会添加到当前线程的Runloop中。...test方法中执行的子线程是同一个,也就是说: 对于该performSelector延迟方法而言,如果在主线程中调用,那么test方法也是在主线程中执行;如果是在子线程中调用,那么test也会在该子线程中执行...所以不需要添加到子线程的Runloop中也能执行。 三 异步执行 如何在不使用GCD和NSOperation的情况下,实现异步线程?

    50810

    iOS底层原理总结 - RunLoop

    RunLoop简介 运行循环,在程序运行过程中循环做一些事情,如果没有Runloop程序执行完毕就会立即退出,如果有Runloop程序会一直运行,并且时时刻刻在等待用户的输入操作。...函数中,开启了一个和主线程相关的RunLoop,导致UIApplicationMain不会返回,一直在运行中,也就保证了程序的持续运行。...= result); } 我们发现RunLoop确实是do while通过判断result的值实现的。因此,我们可以把RunLoop看成一个死循环。...UIInitializationRunLoopMode: 在刚启动 App 时第进入的第一个 Mode,启动完成后就不再使用,会切换到kCFRunLoopDefaultMode 4....注意:只有主线程的RunLoop会默认启动。也就意味着会自动创建自动释放池,子线程需要在线程调度方法中手动添加自动释放池。

    1.4K70

    PHP使用curl_multi_select解决curl_multi网页假死问题的方法

    不过在使用curl_multi的过程中,我们会遇到一个比较头疼的问题,那就是当并发处理的事务数量过多的时候,就会出现CPU过高,网页假死的现象,这是不可以忽视的。...循环的那段,在整个url请求期间是个死循环,它会轻易导致CPU占用很高,网页出现假死状态。...,$active); } while ($mrc == CURLM_CALL_MULTI_PERFORM); while ($active and $mrc == CURLM_OK) { if (curl_multi_select...); 判断是否超时了或者其他错误,在curl_multi_getcontent之前用: curl_error($conn[$i]); 了解multi接口 当程序需要进行多次curl并发请求的时候,curl...2)、调用curl_multi _add_handle把easy curl对象添加到multi curl对象中。 3)、添加完毕后执行curl_multi_perform方法进行并发的访问。

    80220

    iOS 事件处理机制与图像渲染过程

    致歉声明: Peter在开发公众号功能时触发了一个bug,导致群发错误。对此我们深表歉意,并果断开除了Peter。...简单的说,RunLoop是事件驱动的一个大循环,如下代码所示 int main(int argc, char * argv[]) { //程序一直运行状态 while (AppIsRunning...(微信卡顿监控就是利用这个事件通知来记录下最近一次main runloop活动时间,在另一个check线程中用定时器检测当前时间距离最后一次活动时间过久来判断在主线程中的处理逻辑耗时和卡主线程)。...两个线程同时操作view的树形结构:在线程A中for循环遍历并操作当前View的所有subView,然后此时线程B中将某个subView直接删除,这就导致了错乱还可能导致应用崩溃。...当调用 NSObject 的 performSelecter:afterDelay: 后,实际上其内部会创建一个 Timer 并添加到当前线程的 RunLoop 中。

    5.6K100

    深入学习iOS定时器

    Event Loop 在很多系统和框架里都有实现,比如 Node.js 的事件处理,比如 Windows 程序的消息循环,再比如 OSX/iOS 里的 RunLoop。...NSObject iOS框架图 在object-c中,绝大部分类的基类都是NSObject,使用NSObject延迟执行也被用于网络定时刷新,配套使用代码cancelPreviousPerformRequestsWithTarget...GCD GCD定时器其实是一种特殊的分派源,它是基于分派队列的,而NSTimer是基于运行循环的,所以,尤其是在多线程中,GCD定时器要比NSTimer好用的多。...,例如RunLoop 的超时时间就是使用 GCD 中的 dispatch_source_t来实现的,摘自 __CFRunLoopRun中的源码: dispatch_source_t timeout_timer...iOS设备的屏幕刷新频率是固定的,我们在使用时不用关心屏幕的刷新频率,因为它本身就是跟屏幕刷新同步的。CADisplayLink在正常情况下会在每次刷新结束都被调用,精确度相当高。

    98120

    2021年,大厂常问iOS面试题--Runloop篇

    App时第进入的第一个Mode,启动完成后就不再使用 - GSEventReceiveRunLoopMode:接受系统内部事件,通常用不到 ``` 3.runloop内部逻辑?...实际上 RunLoop 就是这样一个函数,其内部是一个 do-while 循环。当你调用 CFRunLoopRun() 时,线程就会一直停留在这个循环里;直到超时或被手动停止,该函数才会返回。 !...5.GCD 在Runloop中的使用? GCD由 子线程 返回到 主线程,只有在这种情况下才会触发 RunLoop。会触发 RunLoop 的 Source 1 事件。...8.PerformSelector:afterDelay:这个方法在子线程中是否起作用? 不起作用,子线程默认没有 Runloop,也就没有 Timer。...CADisplayLink使用场合相对专一,适合做UI的不停重绘,比如自定义动画引擎或者视频播放的渲染。NSTimer的使用范围要广泛的多,各种需要单次或者循环定时处理的任务都可以使用。

    1.9K10

    Java一分钟之-循环结构:for与while循环

    循环结构是编程语言中不可或缺的一部分,它使我们能够重复执行某段代码直到满足特定条件。在Java中,for循环和while循环是最常用的两种循环结构。...初始化与迭代逻辑错误:错误地设置初始值或迭代步骤,可能导致循环不按预期执行或遗漏某些情况。 作用域混淆:循环变量的作用域仅限于循环内部,但在某些情况下,外部访问循环变量可能导致逻辑错误或编译错误。...while (条件) { // 循环体 } 常见问题与易错点: 忘记更新循环条件:与for循环类似,如果循环条件不变,也会导致无限循环。...死循环初始化:循环开始前,循环条件就已经为false,导致循环一次都不执行。 逻辑错误导致的过早退出:错误地修改循环条件,使得循环提前结束。...掌握for和while循环的正确使用,是Java编程中的基础技能。通过注意上述常见问题和采用推荐的避免策略,你可以编写出更加健壮、易于维护的循环逻辑。

    11710

    JavaScript基础-循环结构:for, while, do-while

    循环结构是编程中不可或缺的一部分,它使得代码能够重复执行特定任务直到满足某个条件为止。在JavaScript中,主要的循环结构有for、while和do-while。...二、常见问题与易错点 易错点1:无限循环 问题:忘记更新循环变量或设置错误的退出条件,导致循环永远无法结束。 避免方法:确保循环变量在每次迭代后都有所改变,并仔细检查循环条件逻辑。...易错点2:逻辑错误导致的早期退出或不退出 问题:条件判断逻辑错误,可能导致循环提前结束或不应结束时结束。 避免方法:清晰定义循环的终止条件,并通过注释或代码审查确保逻辑正确。...易错点3:不当使用do-while 问题:在不需要至少执行一次循环体的情况下使用do-while。 避免方法:根据实际需求选择最合适的循环结构,通常初始化条件明确时首选for或while。...; 四、结语 循环结构是编程中的基础且强大的工具,掌握它们能够极大地提高代码的灵活性和效率。然而,不当的使用也会引入难以发现的错误。

    14110
    领券