swift 4.0dispatch_async,dispatch_after的使用

2018年03月28日 16:15:44 xiao_yuly 阅读数:3576

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/jacob_ios/article/details/79729251

Swift 2.x

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) {

let image = self.loadImage()

// 回到主线程更新UI

dispatch_async(dispatch_get_main_queue()) {

self.imageView.image = image

}

}

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, Int64(1.5 * Double(NSEC_PER_SEC))), dispatch_get_main_queue()) {

print("test")

}

Swift 4.0

DispatchQueue.global(qos: .userInitiated).async {

let image = self.loadImage()

// back to the main thread 

DispatchQueue.main.async {

self.imageView.image = image

}

}

DispatchQueue.main.asyncAfter(deadline: .now() + 2.5) {

print("Are we there yet?")

}

2016.08.15 15:44* 字数 206 阅读 1226评论 0喜欢 0

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5.0 * NSEC_PER_SEC)), dispatch_get_global_queue(0, 0), ^{

NSLog(@"延迟了5秒了");

});

1.performSelector方法

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

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

2.定时器:NSTimer

[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方式

double delayInSeconds = 1.0;

__block ViewController* bself = self;

dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC));

dispatch_after(popTime, dispatch_get_main_queue(), ^(void){

[bself delayMethod];

});

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

Swift3.0 延时执行

2016年10月25日

https://blog.csdn.net/c_calary/article/details/52917344

1.延时执行

//延时1秒执行

let time: TimeInterval = 1.0

DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + time) {

//code

print("1 秒后输出")

}

2.对延时执行喵神进行了较好的封装,这里我也贴出来了,供大家学习

import Foundation

typealias Task = (_ cancel : Bool) -> Void

func delay(_ time: TimeInterval, task: @escaping ()->()) ->  Task? {

func dispatch_later(block: @escaping ()->()) {

let t = DispatchTime.now() + time

DispatchQueue.main.asyncAfter(deadline: t, execute: block)

}

var closure: (()->Void)? = task

var result: Task?

let delayedClosure: Task = {

cancel in

if let internalClosure = closure {

if (cancel == false) {

DispatchQueue.main.async(execute: internalClosure)

}

}

closure = nil

result = nil

}

result = delayedClosure

dispatch_later {

if let delayedClosure = result {

delayedClosure(false)

}

}

return result

}

func cancel(_ task: Task?) {

task?(true)

}

/*****使用*****/

//调用

delay(2) { print("2 秒后输出") }

//取消

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

// 仔细想一想..

// 还是取消为妙..

cancel(task)

摘录来自: 王巍 (onevcat). “Swifter - Swift 必备 Tips (第三版)”。 iBooks.

3.OC版本

//延时

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{

//do something 

});

iOS延迟执行方法的更多相关文章

  1. ios开发之-- 延迟执行方法

    延迟执行的几种方法,分享一下. 1.performSelector(NSObject)方法  2.NSTimer方法  3.GCD方法  4.sleep(NSThread)方法 1.performSe ...

  2. iOS 设置 延迟执行 与 取消延迟执行 方法 以及对 run loop 初步认识

    之前开发过程中经常会有需求会使用 NSObject中的"performSelector:withObject:afterDelay:"做方法延迟执行的处理, 但是 还没有什么地方需 ...

  3. iOS 延迟执行代码

    //延迟执行 dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)( * NSEC_PER_SEC)),dispatch_get_main ...

  4. [ios]ios的延迟执行方法

    1.最直接的方法performSelector:withObject:afterDelay: 这种方法的缺点:每次要为延时写一个方法   2.使用类别,用BOLCK执行 [代码]c#/cpp/oc代码 ...

  5. jquery 延迟执行方法

    setTimeout方法使用时需注意: //以下两种方式都行: setTimeout(function () { test(); }, ); //或者 setTimeout(); function t ...

  6. iOS 延迟执行

    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(<#delayInSeconds#> * NSEC_PER_SEC)), ...

  7. 浅谈iOS开发中方法延迟执行的几种方式

    Method1. performSelector方法 Method2. NSTimer定时器 Method3. NSThread线程的sleep Method4. GCD 公用延迟执行方法 - (vo ...

  8. js获取时间,循环执行任务,延迟执行任务

    一.获取时间 核心方法创建一个时间对象:new Date() 时间对象相关操作 时间对象.函数名 函数名 功能 getYear() 获取四位数的年份 getMonth() 获取2位数的月数, 这个是从 ...

  9. IOS中延迟执行的几种方法

    前几天去国美在线面试,就遇到了上面的问题,当时是笔试,只写出来了第一种方法,现在整理了一下. //1.performSelector方法:在当前线程中执行的方法,使用默认模式,并延迟执行@select ...

随机推荐

  1. DNS 访问 Service【转】

    在 Cluster 中,除了可以通过 Cluster IP 访问 Service,Kubernetes 还提供了更为方便的 DNS 访问. kubeadm 部署时会默认安装 kube-dns 组件. ...

  2. main方法

    main函数的分析(python) 对于很多编程语言来说,程序都必须要有一个入口,比如C,C++,以及完全面向对象的编程语言Java,C#等.如果你接触过这些语言,对于程序入口这个概念应该很好理解,C ...

  3. Ubuntu下安装 Mysql

    MYSQL在ubuntu16.04下的编译安装mysql-5.6.23.tar.gz 为减少安装过程中因权限带来个各种问题,建议全程用root用户编译安装,步骤如下: 1.安装依赖文件  apt-ge ...

  4. ubuntu 新建用户后 不能使用TAB键、上下键,命令行不显示当前路径的解决

    因默认ubuntu创建的普通帐号,默认shell为/bin/sh,而这不支持tab等键的,所以将「指定用户」帐号的shell改为/bin/bash就可以了. 1.查看当前的shell:# echo $ ...

  5. 浅谈Spring 5的响应式编程

    这篇使用Spring 5进行响应式编程的入门文章展示了你现在可以使用的一些新的non-blocking, asynchronous.感谢优锐课老师给予的指导! 近年来,由于响应式编程能够以声明性的方式 ...

  6. 013、Java中int类型转换byte

    01.代码如下: package TIANPAN; /** * 此处为文档注释 * * @author 田攀 微信382477247 */ public class TestDemo { public ...

  7. 【转】转帖并注释:Java中的事件处理机制--事件监听器的四种实现方式

    原文地址:http://blog.sina.com.cn/s/blog_4b650d650100nqws.html Java中四种事件监听器的实现方式分别为: 自身类做为事件监听器 外部类作为事件监听 ...

  8. Unity 打开其他exe文件

    using UnityEngine; using System.Collections; using System.Diagnostics;///// public class FeiYuZhu : ...

  9. (最详细)JAVA如何连接虚拟机的HBASE和hadoop(JAVA如何远程访问虚拟机HBASE)

    第一步: 首先把虚拟机和你的主机(本地电脑)弄通这样本地机器才能访问虚拟机里面的内容 我用的虚拟机为 VMware Workstation linux 为 centeros 补充一点虚拟机设置 1  ...

  10. 获取目录结构,并写到txt文档里

    cmd里直接运行: tree /f > ml.txt 写成bat tree D:\a\ /f > D:\a\目录.txt 效果 卷 本地磁盘 的文件夹 PATH 列表 卷序列号为 18A9 ...