SwiftUI——延迟执行操作/定时自动执行操作(使用计时器Timer以及异步DispatchQueue.main.asyncAfter)

编程之家收集整理的这篇文章主要介绍了SwiftUI——延迟执行操作/定时自动执行操作(使用计时器Timer以及异步DispatchQueue.main.asyncAfter)编程之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

概述

在开发软件的过程中,我们不仅需要用户点击的时候执行操作,有时候还需要定时自动进行一些操作。比如最常见的开屏广告倒计时关闭,还比如一些动画效果。实现这些一般有两种方法:一种是使用计时器Timer,一种是使用异步操作。计时器Timer的优势在于可以一直自动运行,直到销毁。缺点在于时间间隔是固定的,不好调整(理论上可以使用一个变量控制间隔,但是可能会比较麻烦)。异步操作的优势在于可以把握一个...

在开发软件过程中,我们不仅需要用户点击的时候执行操作,有时候还需要定时自动进行一些操作。比如最常见的开屏广告倒计时关闭,还比如一些动画效果。实现这些一般有两种方法:一种是使用计时器Timer,一种是使用异步操作。

优势与缺点

  • 计时器Timer是控制多长时间调用一次功能,也就是说Timer的优势在于可以一直自动运行,直到销毁。缺点在于时间间隔是固定的,不好调整(理论上可以使用一个变量控制间隔,但是可能会比较麻烦)。一般需要实现计时器功能的就选这个
  • 异步操作是控制这个调用前需要等待多久。也就是说,异步的优势在于可以控制这个间隔的长度。缺点就是不方便一直运行。一般需要等一段时间运行就使用这个,例如加载素材、网络资源等;或者实现一些奇特的效果

计时器Timer的使用方法

首先我们需要新建一个Timer,使用以下方法创建。最后的.autoconnect()用于自动启动连接这个计时器,我们也可以使用.connect()来手动连接激活。

let timer = Timer.publish(every: 3, on: .main, in: .common).autoconnect()

这里介绍一下这几个参数

  • every:这个参数用于控制Timer多久更新一次,单位是秒。这里3表示3秒。
  • on:这个表示什么时候寄激活这个Timer。这里.main表示在主线程运行的时候开始激活(也就是app开始运行的时候就激活)。还有个.current表示在当前线程运行的时候激活(就是表示当前vIEw界面显示的时候激活)。这里最好不要在一个线程激活另一个线程上的计时器,这可能会导致错误的结果。
  • in:这个是Timer的循环模式。有.common.default.tracking.common包含一个或多个其他运行循环模式的伪模式,使用此模式将对象添加到运行循环时,运行循环在任何常见模式下运行时都会监控对象。有关向公共模式集添加运行循环模式的详细信息,请参阅CFRunMode.default设置为处理连接对象以外的输入源的模式,是最常用的运行循环模式。.tracking控件中跟踪时设置的模式,可以使用此模式添加跟踪期间触发的计时器。

需要注意的是,如果是macOS开发,还会有两个多的模式:.eventTracking.modalPanel.eventTracking是以模态跟踪事件时设置的模式,例如鼠标拖动循环。.modalPanel是等待模态面板(如保存或打开面板)输入时设置的模式。

然后关闭断开Timer,方法如下:

self.timer.upstream.connect().cancel()

Timer看起来很复杂,但是使用其实不用想那么多。接下来讲一讲创建完Timer之后如何使用

在SwiftUI中,我们可以让视图在一些数据更改的时候进行一些操作,方法使用.onReceive(),具体方法如下:

.onReceive(timer) { _ in
	print("计时器活动,加1秒")
}                                 

然后来写一个简单的计时器界面,从5开始倒计时,计时完之后再次循环:

struct TimerVIEw: VIEw {
    @State private var timer = Timer.publish(every: 1, in: .common).autoconnect()
    @State private var countNum = 5
    var body: some VIEw {
        Text("\(countNum)")
            .onReceive(timer) { input in
                if countNum > 0{
                    countNum -= 1
                } else if countNum == 0{
                    countNum = 5
                }
            }
    }
}

异步操作dispatchQueue

接下来说一下异步操作dispatchQueue这个也是很常用的,尤其是需要加载数据或者做效果动画的时候,非常好用。

使用方法如下:

dispatchQueue.main.asyncAfter(deadline: .Now() + .seconds(1), execute: {
    print("等待结束了!")
})

介绍一下参数

  • deadline::什么时候进行操作,这里.Now() + .seconds(1)表示当前时间开始等待1秒。
  • execute::需要进行什么操作。

这个相对来说更简单一些,就不过多介绍了。

总结

以上是编程之家为你收集整理的SwiftUI——延迟执行操作/定时自动执行操作(使用计时器Timer以及异步DispatchQueue.main.asyncAfter)全部内容,希望文章能够帮你解决SwiftUI——延迟执行操作/定时自动执行操作(使用计时器Timer以及异步DispatchQueue.main.asyncAfter)所遇到的程序开发问题。

如果觉得编程之家网站内容还不错,欢迎将编程之家网站推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。

Swift文章

最正确的方法就是去编译后的包里查看。步骤:1、先运行一下项目。2、找到编译后的目录。有两种方法:直接访问/通过XCode进入(1)直接访问编译后的文件路径:/Users/用户名/Library/Developer/Xcode/DerivedData/工程名-sdsdfsfdsfdsdfsf/Build/Products,文件下面有XXX-iphoneos,XXXX-iphonesimulator样式的文件夹。选择符合我们运行设备和版本的文件夹,点击进入。(2)可以通过Xco.
前言在iOS原生开发的时候,凡是涉及到运行项目之后Xcode提示Build target Runner-Log,是不是每次看到这种报错提示就觉得眼前一黑,头皮发麻?其实也没我说的那么夸张,但是有时候遇到这种问题确实比较费头发。本篇文章就来分享一个常见的问题,但是该问题解决起来不复杂,分享出来,方便后期查阅使用。重现报错提示具体在Xcode中的报错提示如下所示:Showing Recent Messagesdiff: /Users/admin/Documents/WorkSpac
本文将会给出2022年软件行业的编程语言、薪水、就业以及技术的深度分析数据全文较长,建议收藏之后,慢慢看文章目录一、最受欢迎的语言 二、最值得学习的语言 三、薪水/工资分析 四、就业状况 五、协作工具数据 六、网络框架分析 七、数据库排名软件开发行业正在全球范围内快速发展。因此,重要的是要掌握最流行的编程语言,以便在这个竞争激烈的行业中建立前途似锦的职业生涯。您可能不必掌握我们今天讨论的所有语言,但您的简历中掌握的语言越多,在 2022 年和未来几年内,就越有客户和开.
~/Library/Developer/Xcode/iOS Device Logs清空 Products~/Library/Developer/Xcode/ProductsXcode 12 及之后版本 还有3个占用内存的文件分别是:第一名:iOS.simruntime 10.29 GB (iOS 日常开发需要使用,勿删)第二名:watchOS.simruntime 7.05 GB (不做 watch 开发可以删除)第三名:tvOS.simruntime 5.39 G
Swift与OC的混编可以总结出以下几种场景OC&Swift Mixed In The Same TargetProject中OC 调用 SwiftPod中OC 调用 SwiftProject中Swift 调用 OCPod中Swift 调用 OCOC&Swift Mixed In The Different TargetOC Project 调用 Swift PodSwift Project 调用 OC PodOC Pod 调用 Swift PodSwift
最近数据结构实践课经常需要进行二进制文件读写,总结出以下经验:1. 读写二进制文件最好加上ios::binary2. 二进制文件用fstream读写时既可以输入又可以输出,此模式下可以实现只修改文件部分内容例如,我创建了含有100个数的二进制文件data_unsorted.dat,生成结果如下:写入如下代码(ios::in不能少) file.open("data_unsorted.dat", ios::binary | ios::in | ios::out); in.
微信公众号搜索 “ 程序精选 ” ,选择关注!
微信公众号搜 "程序精选"关注