iOS开发——实用技术&常见延迟方式总结(OC/Swift)

常见延迟方式总结

本文列举了四种延时执行某函数的方法及其一些区别。假如延时1秒时间执行下面的方法。

- (void)delayMethod { NSLog(@"execute"); }

1.performSelector方法:(Swift中没有这个方法,因为在swift中这个方法是被认为是不安全的)

[self performSelector:@selector(delayMethod) withObject:nil afterDelay:1.0f];

此方式要求必须在主线程中执行,否则无效。
是一种非阻塞的执行方式,
暂时未找到取消执行的方法。

2.定时器:NSTimer

 1 [NSTimer scheduledTimerWithTimeInterval:1.0f target:self selector:@selector(delayMethod) userInfo:nil repeats:NO]; 

此方式要求必须在主线程中执行,否则无效。
是一种非阻塞的执行方式,
可以通过NSTimer类的- (void)invalidate;取消执行。

3. sleep方式

[NSThread sleepForTimeInterval:1.0f]; [self delayMethod];

此方式在主线程和子线程中均可执行。
是一种阻塞的执行方式,建方放到子线程中,以免卡住界面
没有找到取消执行的方法。

4.GCD方式

1 double delayInSeconds = 1.0;
2
3  __block ViewController* bself = self;
4
5  dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC));
6
7 dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
8
9  [bself delayMethod]; });

此方式在可以在参数中选择执行的线程。
是一种非阻塞的执行方式,
没有找到取消执行的方法。

Swift中怎么实现

1.sleep
 1 // 创建目标队列
 2 let workingQueue = dispatch_queue_create("my_queue", nil)
 3
 4 // 派发到刚创建的队列中,GCD 会负责进行线程调度
 5 dispatch_async(workingQueue) {
 6     // 在 workingQueue 中异步进行
 7     println("努力工作")
 8     NSThread.sleepForTimeInterval(2)  // 模拟两秒的执行时间
 9
10     dispatch_async(dispatch_get_main_queue()) {
11         // 返回到主线程更新 UI
12         println("结束工作,更新 UI")
13     }
14 }
2.GCD
1 let time: NSTimeInterval = 2.0
2 let delay = dispatch_time(DISPATCH_TIME_NOW,
3                          Int64(time * Double(NSEC_PER_SEC)))
4 dispatch_after(delay, dispatch_get_main_queue()) {
5     println("2 秒后输出")
6 }

封装一下

 1 import Foundation
 2
 3 typealias Task = (cancel : Bool) -> ()
 4
 5 func delay(time:NSTimeInterval, task:()->()) ->  Task? {
 6
 7     func dispatch_later(block:()->()) {
 8         dispatch_after(
 9             dispatch_time(
10                 DISPATCH_TIME_NOW,
11                 Int64(time * Double(NSEC_PER_SEC))),
12             dispatch_get_main_queue(),
13             block)
14     }
15
16     var closure: dispatch_block_t? = task
17     var result: Task?
18
19     let delayedClosure: Task = {
20         cancel in
21         if let internalClosure = closure {
22             if (cancel == false) {
23                 dispatch_async(dispatch_get_main_queue(), internalClosure);
24             }
25         }
26         closure = nil
27         result = nil
28     }
29
30     result = delayedClosure
31
32     dispatch_later {
33         if let delayedClosure = result {
34             delayedClosure(cancel: false)
35         }
36     }
37
38     return result;
39 }
40
41 func cancel(task:Task?) {
42     task?(cancel: true)
43 }

使用:

  • let task = delay(5) { println("拨打 110") }

    // 仔细想一想..
    // 还是取消为妙..
    cancel(task)

时间: 2024-10-16 11:18:21

iOS开发——实用技术&常见延迟方式总结(OC/Swift)的相关文章

iOS开发几年了,你清楚OC中的这些东西么1

前言 几年前笔者是使用Objective-C进行iOS开发, 不过在两年前Apple发布swift的时候,就开始了swift的学习, 在swift1.2发布后就正式并且一直都使用了swift进行iOS的开发了, 之后就是对swift持续不断的学习, 近来swift3.0的发布, 更多的人会选择swift来进行iOS的开发看上去更是成为了一种趋势, 不过一个合格的iOS开发者对oc以及c语言的掌握是必不可少的技能, 本篇中主要是写一些大家平时都可能用到但是不一定知道的oc的东西 1.oc中的对象的

IOS开发复习笔记(1)-OC基础知识

在上班之余学习IOS已经有三个多月了,因为基础有些薄弱从OC的基本语法开始学习的,相继看了青柚子和红柚子的书,现在在看编程实战,趁这个机会好好的总结一下: 1.命名约定 对象类型和名称一致,以免混淆 -(void) setURL:(NSString *)URL;//错误的命名方法 //更改为 -(void)setURLString:(NSString *)string; -(void)setURL:(NSURL *)URL; 静态变量(包括作用域)以s开头,而全集变量采用g开头,在通常情况下应避

iOS开发中常见的一些异常

iOS开发中常见的异常包括以下几种NSInvalidArgumentExceptionNSRangeExceptionNSGenericExceptionNSInternallnconsistencyExceptionNSFileHandleOperationException NSInvalidArgumentException非法参数异常是objective-C代码最常出现的错误,所以平时写代码的时候,需要多加注意,加强对参数的检查,避免传入非法参数导致异常,其中尤以nil参数为甚. 1.集

iOS开发——实用技术OC篇&单例模式的实实现(ACR&MRC)

单例模式的实实现(ACR&MRC) 在iOS开发中单例模式是一种非常常见的模式,虽然我们自己实现的比较少,但是,系统却提供了不少的到来模式给我们用,比如最常见的UIApplication,Notification等, 那么这篇文章就简单介绍一下,我们开发中如果想要实现单例模式要怎么去实现! 单例模式顾名思义就是只有一个实例,它确保一个类只有一个实例,并且自行实例化并向整个系统提供这个实例.它经常用来做应用程序级别的共享资源控制.这个模式使用频率非常高,通过一个单例类,可以实现在不同窗口之间传递数

iOS开发——实用技术OC篇&多线程整合

多线程整合 本文知识对iOS开发中多线程的一些知识整合,关于一些概念和技术问题并没有过多的介绍,如果你想了解更多请查看笔者之前写的iOS开发之多线程详解(比较完整):但是有部分涉及到之前文章中没有的技术点和常识,比如加锁的方式,面试相关的,还有一些关于GCD的高级用法,希望你能认真看完,或许可以收获到很多! http://www.cnblogs.com/iCocos/p/4553103.html http://www.cnblogs.com/iCocos/p/4553262.html ??先来看

iOS开发——实用技术OC篇&事件处理详解

事件处理详解 一:事件处理 事件处理常见属性: 事件类型 @property(nonatomic,readonly) UIEventType     type; @property(nonatomic,readonly) UIEventSubtype  subtype; 事件产生的时间 @property(nonatomic,readonly) NSTimeInterval  timestamp; 事件传递 - hitTest:withEvent: SWIFT func hitTest(_ po

ios开发——实用技术OC-Swift篇&触摸与手势识别

iOS开发学习之触摸事件和手势识别 iOS的输入事件 触摸事件 手势识别 手机摇晃 一.iOS的输入事件 触摸事件(滑动.点击) 运动事件(摇一摇.手机倾斜.行走),不需要人为参与的 远程控制事件(耳机控制手机声音) 1??iOS事件对象都是UIEvent类的实例 UIEvent类对事件类型定义了enum常量: typedef NS_ENUM(NSInteger, UIEventType){ UIEventTypeTouches, UIEventTypeMotion, UIEventRemote

iOS开发中常见的语句@synthesize obj = _obj 的意义详解

我们在进行iOS开发时,经常会在类的声明部分看见类似于@synthesize window=_window; 的语句,那么,这个window是什么,_ window又是什么,两个东西分别怎么用,这是一个比较基本的问题,也关乎我们理解Objective-C中对类.类的属性.类的存取器.类的局部变量的统一理解. 在32位系统中,如果类的 @interface 部分没有进行 ivar 声明,但有 @property 声明,在类的 @implementation 部分有响应的 @synthesize,则

在iOS 开发中用GDataXML(DOM方式)解析xml文件

因为GDataXML的内部实现是通过DOM方式解析的,而在iOS 开发中用DOM方式解析xml文件,这个时候我们需要开启DOM,因为ios 开发中是不会自动开启的,只有在mac 开发中才自动开启的.我们需要做如下配置: 当配置玩这个操作之后,再次进行编译的时候,系统还是报错,是因为我们还需要进行如下操作: