在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. User mode and kernel mode

    [User mode and kernel mode] 参考:https://msdn.microsoft.com/en-us/library/windows/hardware/ff554836(v= ...

  2. 关于apache httpd.conf脚本的理解

    新人一枚,这两天一直在研究lamp的搭建,感觉自己对apache理解的不够深彻,决定写这一篇(翻译)httpd.conf文件 未完待续 cat /usr/local/apache/conf/httpd ...

  3. Struts框架——(一)用Servlet + JSP演示Struts基本原理

    一. 用Servlet + JSP演示Struts基本原理 struts是开源项目.它通过采用 Java Servlet/JSP 技术,实现了基于Java EE Web应用的MVC的应用框架.Stru ...

  4. JAVA 之print,printf,println

    print:将它的参数显示在命令窗口,并将输出光标定位在所显示的最后一个字符之后. println: 将它的参数显示在命令窗口,并在结尾加上换行符,将输出光标定位在下一行的开始. printf:是格式 ...

  5. [转] Oracle sql 查询突然变慢 -- 案例分析

    转自:http://jingyan.baidu.com/article/8275fc868ce57946a03cf692.html 一条sql突然执行变慢,耗时9秒,应用是不能改的,只能从数据库方面下 ...

  6. TCP协议学习记录 (二) Ping程序

    简单的实现了一个ping程序,没有做icmp差错报文的检查. 支持自定义字节数,支持发包个数 #pragma pack(4) #define ECHO_REQUEST 8 #define DATASI ...

  7. 我总结的git命令指南。

    git命令行指南 1.windows上安装git的网址:http://msysgit.github.com/. 没有安装过git的 这个网址里下mymsgit. 因为发现有些同学对git还不是那么熟悉 ...

  8. ssh学习小记

    ssh 为Secure SHell 的缩写.OpenSSH: ssh协议的开源实现.  SSH协议版本 v1: 基于CRC-32做MAC,不安全:man-in-middle v2:双方主机协议选择安全 ...

  9. Shell使用技巧

    巧用定界符delimiter 输入大段文本的地方 自动选择和输入的地方 访问数据库 Angel@DESKTOP-254LBLA ~ $ cat > out.txt << EOF &g ...

  10. android 应用笔记

    android 应用笔记 android 应用笔记 小书匠 Android 综合教程 Android常用技巧 安卓系统架构 安卓源码开发 安卓驱动 Linux内核 安卓应用开发 Java 教程 tic ...