如何在Swift 中使用 async let 并发运行后台任务.docxVIP

如何在Swift 中使用 async let 并发运行后台任务.docx

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多

如何在Swift?中使用?async?let?并发运行后台任务

目录前言长期运行的任务阻塞了UI使用async/await在后台执行任务在后台执行多个任务使用asynclet下载多个文件结论

前言

Async/await语法是在Swift5.5引入的,在WWDC2025中的Meetasync/awaitinSwift对齐进行了介绍。它是编写异步代码的一种更可读的方式,比调度队列和回调函数更容易理解。Async/await语法与其他编程语言(如C#或JavaScript)中使用的语法类似。使用asynclet是为了并行的运行多个后台任务,并等待它们的综合结果。

Swift异步编程是一种编写允许某些任务并发运行而不是按顺序运行的代码的方法。这可以提高应用程序的性能,允许它同时执行多个任务,但更重要的是,它可以用来确保用户界面对用户输入的响应,同时任务在后台线程上执行。

长期运行的任务阻塞了UI

在一个同步的程序中,代码以线性的、从上到下的方式运行。程序等待当前任务完成后再进入下一任务。这在用户界面(UI)方面会产生问题,因为如果一个长期运行的任务被同步执行,程序就会阻塞,UI就会变得没有反应,直到任务完成。

下面的代码模拟了一个长期运行的任务,如以同步方式下载一个文件,其结果是UI变得没有反应,直到任务完成。这样的用户体验是不可接受的。

Model:

structDataFile:Identifiable,Equatable{

varid:Int

varfileSize:Int

vardownloadedSize=0

varisDownloading=false

init(id:Int,fileSize:Int){

self.id=id

self.fileSize=fileSize

varprogress:Double{

returnDouble(self.downloadedSize)/Double(self.fileSize)

mutatingfuncincrement(){

ifdownloadedSizefileSize{

downloadedSize+=1

}

ViewModel:

classDataFileViewModel:ObservableObject{

@Publishedprivate(set)varfile:DataFile

init(){

self.file=DataFile(id:1,fileSize:10)

funcdownloadFile(){

file.isDownloading=true

for_in0..file.fileSize{

file.increment()

usleep(300000)

file.isDownloading=false

funcreset(){

self.file=DataFile(id:1,fileSize:10)

}

View:

structTestView1:View{

@ObservedObjectprivatevardataFiles:DataFileViewModel

init(){

dataFiles=DataFileViewModel()

varbody:someView{

VStack{

///从文末源代码获取其实现

TitleView(title:[Synchronous])

Button(DownloadAll){

dataFiles.downloadFile()

.buttonStyle(BlueButtonStyle())

.disabled(dataFiles.file.isDownloading)

HStack(spacing:10){

Text(File1:)

ProgressView(value:dataFiles.file.progress)

.frame(width:180)

Text(\((dataFiles.file.progress*100),specifier:%0.0F)%)

ZStack{

Color.clear

.frame(width:30,heigh

文档评论(0)

152****2426 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档