在iOS开发中,一个操作我们希望不要立刻执行,而是等上几秒之后再来处理,这时我们就需要延时处理,我们来看看这些方

1.最直接的方法performSelector:withObject:afterDelay:
performSelector方法

   self performSelector:<#(nonnull SEL)#> withObject:<#(nullable id)#> afterDelay:<#(NSTimeInterval)#>

这个方法简单易懂,就是要另外定义一个方法让它调用,这无疑增加了文件负担,之前看到博客上说这个方法只能在主线程中调用,经过测试事实并非如此,在子线程中同样可以调用该方法,只是需要手动去创建子线程对应的Runloop ,而Runloop在主线程中是默认创建的,performSelector方法会在runloop创建的时候,添加到runloop中,然后在其中进行处理.而runloop又有多种模式(runloop就不详解了,有感兴趣的可以私信讨论),所以又衍生出下面的方法

    [self performSelector:<#(nonnull SEL)#> withObject:<#(nullable id)#> afterDelay:<#(NSTimeInterval)#> 
inModes:<#(nonnull NSArray<NSString *> *)#>

可以看到后面多出的Moods, 就是可以选择的模式,如果你对runloop还不是很了解,传入NSRunLoopCommonModes就可以了 .

2.定时器:NSTimer

    [NSTimer scheduledTimerWithTimeInterval:<#(NSTimeInterval)#> target:<#(nonnull id)#> selector:<#(nonnull SEL)#>
userInfo:<#(nullable id)#> repeats:<#(BOOL)#>]
参数1:多久后执行方法 参数2:响应者 参数3:执行的方法 参数4:使用信息(nil 即可) 参数5:是否重复

这个方法很常用,因为可以定时,相当于每隔一段时间系统就要做你传给他的方法 ,并且可以随时关闭它,用- (void)invalidate对象方法即可,-(void)fire便可开启. 用起来还是很灵活的 , 它和performSelector一样都是要开启子线程runloop才能在子线程中使用,加上下面这句,原理和performSelector大同小异,等以后写runloop咱们再细说.

  [[NSRunLoop mainRunLoop] addTimer:self.timer forMode:NSRunLoopCommonModes];

3. sleep方式

    [NSThread sleepForTimeInterval:<#(NSTimeInterval)#>]

这个方法看上去就霸气,直接让线程休眠,所以即使它可以任意在主线程或子线程使用,但是因为会阻塞线程还是放在子线程中保险一点,而且一旦执行想取消就没那么容易了o(╯□╰)o .

4.GCD方式

    dispatch_after(<#dispatch_time_t when#>, <#dispatch_queue_t queue#>, <#^(void)block#>)
参数1:延时时间 参数2:控制队列 参数3:延时后调用的方法

我个人比较喜欢这个方法,不仅可以控制队列(相当于控制线程) ,而且block回调又省去了另设方法的麻烦.(GCD也是一个很有意思的东西,很多)

5.uiview 的动画延时

  UIView animateWithDuration:<#(NSTimeInterval)#> delay:<#(NSTimeInterval)#> options:<#(UIViewAnimationOptions)#> 
animations:<#^(void)animations#> completion:<#^(BOOL finished)completion#>

在UI界面使用还是很好用的,即可以设置开始状态,又可以设置结束状态, 如何能发挥最大的功效也全在自己的掌握.

以上是我总结的几种延时方案, 当然还有很多方法,像NSOperation,将操作封装在它的NSBlockOperation回调中,就可以设置操作的暂停或者恢复,也可以取消,感觉上是不是和下载业务关联很大,你可以用 NSOperation来操作下载,上传任务.

这么多方法可以选择,相信以后再处理延时的时候就可以考虑一下那种更符合你的开发需求,但是使用一定要注意线程问题 ,延时刷新UI界面当然就要放在主线程,而一些耗时的操作就在子线程中搞定.

最后说一句,程序也和生活一样,有时需要停下来歇一歇,才能更好的完成接下来的任务,最后祝你在iOS学习的道路上张弛有度,策马奔腾.

iOS-延时操作汇总的更多相关文章

  1. iOS 学习资料汇总

    (适合初学者入门) 本文资料来源于GitHub 一.视频教程(英文) Developing iOS 7 Apps for iPhone and iPad斯坦福开放教程之一, 课程主要讲解了一些 iOS ...

  2. JQuery延时操作

    JQuery通过setTimeout函数可以实现延时操作以完成在编程达到某些需要的效果. 使用方法如下: function doSomething() { alert("hello worl ...

  3. PHP数组操作汇总

    php 操作数组 (合并,拆分,追加,查找,删除等) - Just Code - ITeye技术网站 PHP操作数组的一些函数介绍 -- 简明现代魔法 PHP数组元素操作实例 -- 简明现代魔法 儿童 ...

  4. iOS 数据库操作(使用FMDB)

    iOS 数据库操作(使用FMDB)   iOS中原生的SQLite API在使用上相当不友好,在使用时,非常不便.于是,就出现了一系列将SQLite API进行封装的库,例如FMDB.Plausibl ...

  5. iOS——文件操作NSFileManager (创建、删除,复制,粘贴)

    iOS——文件操作NSFileManager (创建.删除,复制,粘贴)       iOS的沙盒机制,应用只能访问自己应用目录下的文件.iOS不像android,没有SD卡概念,不能直接访问图像.视 ...

  6. IOS文件操作的两种方式:NSFileManager操作和流操作

    1.常见的NSFileManager文件方法 -(NSData *)contentsAtPath:path //从一个文件读取数据 -(BOOL)createFileAtPath: path cont ...

  7. 提升效率的Linux终端快捷操作汇总

    很多普通 Linux 桌面用户都对使用终端感到排斥和恐惧,其实它没大家想的那么复杂,很多常见操作都可以直接在终端中进行,如:安装软件.升级系统等. 无论你是新手还是 Linux 终端使用的老鸟,系统极 ...

  8. Appium - iOS 各种问题汇总

    Appium - iOS 各种问题汇总 作者: Max.Bai 时间: 2014/10 Appium - iOS 各种问题汇总  1. Appium 滑动: swipe 有三种方式:  第一种:swi ...

  9. IOS数据库操作SQLite3使用详解(转)

    iPhone中支持通过sqlite3来访问iPhone本地的数据库.具体使用方法如下1:添加开发包libsqlite3.0.dylib首先是设置项目文件,在项目中添加iPhone版的sqlite3的数 ...

  10. SQL字符串操作汇总

    SQL字符串操作汇总 --将字符串中从某个字符开始截取一段字符,然后将另外一个字符串插入此处 select stuff('hello,world!',4,4,'****')   --返回值hel*** ...

随机推荐

  1. cookie小记

    清除cookie可用下面2种的方法.注意如果要清除的cookie的域是指定的,则这里也应该指定,否则无效                1:                Response.Cooki ...

  2. 第一次到IT公司上班!

    今日是自个的首次正式到IT公司进行作业,感触也是别有一番兴趣!如今就让自个回味下第一天的作业经历吧! 我上班的公司叫西安西科软件技术有限公司,第一天上班的缘故,早上起得很早,差不多六点半还没到就起床洗 ...

  3. TimeQuest学习

    1.物理时钟特性:clock skew(时钟差),jitter(拉动),clock latency(时钟潜伏),这些物理时钟特性又称为uncertainl--非定性,或非理想性. clock skew ...

  4. Linux上的常用软件

    zsh (fish): a new shell oh my zsh: zsh's conf file apvlv: pdf viewer(vim style) autojump: quick 'cd'

  5. MSSQLSERVER服务无法启动的解决方案

    MSSQLSERVER服务无法启动的解决方案 有时候sqlserver无法启动了,原因是mssqlserver服务没有启动,当你手动启动时,又出现服务无法响应的可恶错误提示... 笔者“有幸”遇到了, ...

  6. 一个div,包含三个小的div,平均分布的样式

    从11月份开始,自学前端开发,写静态页面中,经常用到一个大的div下包含三个小的div,平均分布div大小样式,写过多次,也多次忘记,每次都要现找资料,不想之后,在这么麻烦,索性今天自己记录一下,方便 ...

  7. iconv将文件编码从gb2312 转换为utf-8

    iconv命令用于转换指定文件的编码,默认输出到标准输出设备,亦可指定输出文件. 用法: iconv [选项...] [文件...] 有如下选项可用: 输入/输出格式规范:-f, --from-cod ...

  8. 用js将从后台得到的时间戳(毫秒数)转换为想要的日期格式

    得到后台从数据库中拿到的数据我们希望格式是 2016年10月25日 17时37分30秒 或者 2016/10/25 17:37:30 然而我们前台得到的却是一段数字(时间戳,毫秒数) 14773860 ...

  9. windows 下ssh 客户端

    今天用 xshell 和 bitvise ssh 在 windows 登录SSH ,发现 vi 一些中文内容的文件会出现乱码,配置无效,在网上找到一款不会中文乱码的SSH客户端 MobaXterm , ...

  10. 20151208Study

    20151208-----------------------------------------------------* Her main interest now is raising her ...