在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. Halcon学习之条形码实时扫描

    dev_open_window(1,1,400,400,'blue',ThisHandle) create_bar_code_model([], [], BarCodeHandle) set_bar_ ...

  2. &&和||的妙用

    在js逻辑运算中,0."".null.false.undefined.NaN都会判为false,其他都为true 几乎所有语言中||和&&都遵循“短路”原理,如&a ...

  3. [知识整理]Java集合

    Mark Java集合图

  4. SQL Cumulative Sum累积求和

    期望结果:  ID  VAL  CumSum  1  10  10  2  20  30  3  30  60 方法一: 使用分析函数 select id,val,sum(val) over ( or ...

  5. JavaScript 数组冒泡排序练习

    12.29下午主要讲的是简单的一维数组 和数组中利用冒泡排序排列大小 比如有 数字 0.5  20   1   5   4   3   6   利用冒泡排序按照从小到大的顺序排列 var arr=ne ...

  6. MSSQL附加数据库5120错误(拒绝访问)处理方法

    一. 右键需要附加的数据库文件,弹出属性对话框,选择安全标签页. 找到Authenticated Users用户名. 如未找到,进行Authenticated Users用户名的添加. 二. 添加Au ...

  7. selenium第二课(脚本录制seleniumIDE的使用)

    一.Selenium也具有录制功能,可以web中回放,录制的脚本可以转换为java.python.ruby.php等多种脚本语言.seleniumIDE是Firefox的一个插件,依附于Firefox ...

  8. 关于yii2框架活动记录activeRecord添加默认字段的问题

    平时使用sql的时候可以如下添加默认字段flag: "select a.*,0 as flag from user_info a", 对于yii2框架则需要这样: $query = ...

  9. Cordova系列(一)

    1.安装 这里推荐用npm安装cordova,至于npm的安装,网上有很多的.打开命令行,输入 npm install -g cordova 这里就安装了好了最新版的cordova,虽然绝大多数会成功 ...

  10. Verilog经典输入控制/激励信号模板1

    :]i;   always @ ( posedge CLOCK or negedge RESET )  if( !RESET ) begin  i <= 'd0;  Start_Si ...