精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Swift AsyncThrowingStream 和 AsyncStream 代碼實例詳解

移動開發(fā) iOS
你可以把 AsyncThrowingStream 看作是一個有可能導致拋出錯誤的元素流。他的值隨著時間的推移而傳遞,流可以通過一個結(jié)束事件來關閉。一旦發(fā)生錯誤,結(jié)束事件既可以是成功,也可以是失敗。

前言

AsyncThrowingStream 和 AsyncStream 是 Swift 5.5 中由 SE-314[1] 引入的并發(fā)框架的一部分。異步流允許你替換基于閉包或 Combine 發(fā)布器的現(xiàn)有代碼。

在深入研究圍繞拋出流的細節(jié)之前,如果你還沒有閱讀我的文章,我建議你先閱讀我的文章,內(nèi)容包括async-await。本文解釋的大部分代碼將使用那里解釋的API。

什么是 AsyncThrowingStream?

你可以把 AsyncThrowingStream 看作是一個有可能導致拋出錯誤的元素流。他的值隨著時間的推移而傳遞,流可以通過一個結(jié)束事件來關閉。一旦發(fā)生錯誤,結(jié)束事件既可以是成功,也可以是失敗。

什么是 AsyncStream?

AsyncStream 類似于拋出的變體,但絕不會導致拋出錯誤。一個非拋出型的異步流會根據(jù)明確的完成調(diào)用或流的取消而完成。

注意: 在這篇文章中,我們將解釋如何使用AsyncThrowingStream。除了發(fā)生錯誤處理的部分,代碼示例與AsyncStream類似。

AsyncThrowingStream

如何使用 AsyncThrowingStream

AsyncThrowingStream 可以很好地替代現(xiàn)有的基于閉包的代碼,如進度和完成處理程序。為了更好地理解我的意思,我將向你介紹我們在 WeTransfer 應用程序中遇到的一個場景。

在我們的應用程序中,我們有一個基于閉包的現(xiàn)有類,叫做 FileDownloader:

struct FileDownloader {
enum Status {
case downloading(Float)
case finished(Data)
}

func download(_ url: URL, progressHandler: (Float) -> Void, completion: (Result<Data, Error>) -> Void) throws {
// .. Download implementation
}
}

文件下載器接受一個URL,報告進度情況,并完成一個包含下載數(shù)據(jù)的結(jié)果或在失敗時顯示一個錯誤。

文件下載器在文件下載過程中報告一個數(shù)值流。在這種情況下,它報告的是一個狀態(tài)值流,以報告正在運行的下載的當前狀態(tài)。FileDownloader 是一個完美的例子,你可以重寫一段代碼來使用 AsyncThrowingStream。然而,重寫需要你在實現(xiàn)層面上也重寫你的代碼,所以讓我們定義一個重載方法來代替:

extension FileDownloader {
func download(_ url: URL) -> AsyncThrowingStream<Status, Error> {
return AsyncThrowingStream { continuation in
do {
try self.download(url, progressHandler: { progress in
continuation.yield(.downloading(progress))
}, completion: { result in
switch result {
case .success(let data):
continuation.yield(.finished(data))
continuation.finish()
case .failure(let error):
continuation.finish(throwing: error)
}
})
} catch {
continuation.finish(throwing: error)
}
}
}
}

正如你所看到的,我們把下載方法包裹在一個 AsyncThrowingStream 里面。我們將流的值 Status 的類型描述為一個通用的類型,允許我們用狀態(tài)更新來延續(xù)流。

只要有錯誤發(fā)生,我們就會通過拋出一個錯誤來完成流。在完成處理程序的情況下,我們要么通過拋出一個錯誤來完成,要么用一個不拋出的完成回調(diào)來跟進數(shù)據(jù)的產(chǎn)生。

switch result {
case .success(let data):
continuation.yield(.finished(data))
continuation.finish()
case .failure(let error):
continuation.finish(throwing: error)
}

在收到最后的狀態(tài)更新后,不要忘記 finish() 回調(diào),這一點至關重要。否則,我們將保持流的存活,而實現(xiàn)層面的代碼將永遠不會繼續(xù)。

我們可以通過使用另一個 yield 方法來重寫上述代碼,接受一個 Result 枚舉作為參數(shù):

continuation.yield(with: result.map { .finished($0) })
continuation.finish()

重寫后的代碼簡化了我們的代碼,并去掉了 switch-case 代碼。我們必須映射我們的 Reslut 枚舉以匹配預期的 Status 值。如果我們產(chǎn)生一個失敗的結(jié)果,我們的流將在拋出包含的錯誤后結(jié)束。

AsyncThrowingStream 迭代

一旦你配置好你的異步拋出流,你就可以開始在數(shù)值流上進行迭代。在我們的 FileDownloader 例子中,它將看起來如下所示:

do {
for try await status in download(url) {
switch status {
case .downloading(let progress):
print("Downloading progress: \(progress)")
case .finished(let data):
print("Downloading completed with data: \(data)")
}
}
print("Download finished and stream closed")
} catch {
print("Download failed with \(error)")
}

我們處理任何狀態(tài)的更新,并且我們可以使用 catch 閉包來處理任何發(fā)生的錯誤。你可以使用基于 AsyncSequence 接口的 for ... in 循環(huán)進行迭代,這對 AsyncStream 來說是一樣的。

如果你遇到了類似的編譯錯誤:

‘a(chǎn)sync’ in a function that does not support concurrency

上述代碼示例中的打印語句有助于你理解 AsyncThrowingStream 的生命周期。你可以替換打印語句來處理進度更新和處理數(shù)據(jù),為你的用戶實現(xiàn)可視化。

調(diào)試 AsyncStream

如果一個流不能報告數(shù)值,我們可以通過放置斷點來調(diào)試流產(chǎn)生的回調(diào)。雖然也可能是上面的 “Download finished and stream closed” 的打印語句不會調(diào)用,這意味著你在實現(xiàn)層的代碼永遠不會繼續(xù)。后者可能是一個未完成的流的結(jié)果。

為了驗證,我們可以利用 onTermination 回調(diào):

func download(_ url: URL) -> AsyncThrowingStream<Status, Error> {
return AsyncThrowingStream { continuation in

/// 配置一個終止回調(diào),以了解你的流的生命周期。
continuation.onTermination = { @Sendable status in
print("Stream terminated with status \(status)")
}

// ..
}
}

回調(diào)在流終止時被調(diào)用,它將告訴你你的流是否還活著。

如果出現(xiàn)了錯誤,輸出結(jié)果可能如下:

Stream terminated with status finished(Optional(FileDownloader.FileDownloadingError.example))

上述輸出只有在使用 AsyncThrowingStream 時才能實現(xiàn)。如果是一個普通的 AsyncStream,完成的輸出看起來如下:

Stream terminated with status finished

而取消的結(jié)果對這兩種類型的流來說都是這樣的:

Stream terminated with status cancelled

你也可以在流結(jié)束后使用這個終止回調(diào)進行任何清理。例如,刪除任何觀察者或在文件下載后清理磁盤空間。

取消一個 AsyncStream

一個 AsyncStream 或 AsyncThrowingStream 可以由于一個封閉的任務被取消而取消。一個例子可以如下:

let task = Task.detached {
do {
for try await status in download(url) {
switch status {
case .downloading(let progress):
print("Downloading progress: \(progress)")
case .finished(let data):
print("Downloading completed with data: \(data)")
}
}
} catch {
print("Download failed with \(error)")
}
}
task.cancel()

一個流在超出范圍或包圍的任務取消時就會取消。如前所述,取消將相應地觸發(fā) onTermination 回調(diào)。

結(jié)論

AsyncThrowingStream 或 AsyncStream 是重寫基于閉包的現(xiàn)有代碼到支持 async-awai t的替代品的好方法。你可以提供一個連續(xù)的值流,并在成功或失敗時完成一個流。你可以使用基于 AsyncSequence APIs 的 for 循環(huán)在實現(xiàn)層面上迭代值。

參考資料

[1]SE-314: ??https://github.com/apple/swift-evolution/blob/main/proposals/0314-async-stream.md。??

責任編輯:姜華 來源: Swift社區(qū)
相關推薦

2022-12-02 09:02:36

Swift代碼異步

2022-11-21 09:01:00

Swift并發(fā)結(jié)構(gòu)

2022-10-10 09:00:29

SendableSwift

2009-09-02 17:12:06

C#關機代碼

2009-06-15 15:16:00

netbeans sw平臺開發(fā)

2009-07-09 15:05:45

Servlet實例

2018-10-12 11:11:39

Oracle內(nèi)存結(jié)構(gòu)

2009-07-09 17:33:39

2011-03-29 10:47:49

ORACLE數(shù)據(jù)庫

2010-01-05 13:54:58

交換機配置VLAN

2024-02-02 09:04:23

VueKeepAlive緩存組件

2009-06-11 08:59:35

2014-07-25 15:03:33

Linuxshellsed

2012-07-12 16:00:32

OpenStackSwift架構(gòu)

2022-01-16 08:00:28

PythonFor循環(huán)

2023-10-31 12:59:00

C++編程語言

2011-03-09 09:11:52

java反射機制

2011-06-24 14:34:17

Qt 小票 打印

2009-06-10 14:53:25

netbeans st實例

2010-06-22 10:28:04

linux at命令
點贊
收藏

51CTO技術(shù)棧公眾號

亚洲精品在线电影| 国产精品美女久久久久aⅴ国产馆| 欧美激情综合色综合啪啪五月| 日本精品一二三区| 国产免费不卡| 亚洲黄色小视频| 玖玖玖精品中文字幕| ,一级淫片a看免费| 在线综合视频| 日韩在线观看高清| 国产精品无码一区二区三区免费 | 国产又粗又长视频| 亚洲黄色大片| 精品国产一区二区三区久久| 久久人妻一区二区| 麻豆久久久久| 亚洲18女电影在线观看| 亚洲欧洲精品在线| 午夜黄色小视频| 国产伦精一区二区三区| 国产成人精品一区二区在线| 久久久美女视频| 日本欧美国产| 亚洲男人的天堂在线| 波多野结衣在线免费观看| 小黄鸭精品aⅴ导航网站入口| 一区二区三区.www| youjizz.com亚洲| 波多野结衣办公室33分钟| www.久久草.com| 日本精品一区二区三区高清| www.欧美黄色| 国产午夜精品久久久久免费视| 26uuu成人网一区二区三区| 97超碰人人模人人爽人人看| 一级片免费网站| 超碰在线免费公开| 正在播放日韩精品| 国产精品乱子久久久久| 日本一区二区三区视频在线观看| 丰满人妻一区二区三区无码av| 麻豆精品国产传媒mv男同| 青草青草久热精品视频在线网站 | 99国产高清| 国产女人爽到高潮a毛片| 日韩av不卡在线观看| 全球成人中文在线| 国产又爽又黄的视频| 激情综合在线| 久久久久中文字幕2018| 欧美黑人性猛交xxx| 91超碰国产精品| 操日韩av在线电影| 美国黄色小视频| 天天综合精品| 久久久精品在线| 永久久久久久久| 午夜精品久久| 欧美激情伊人电影| 国产在线精品观看| 国产午夜久久| 日本三级韩国三级久久| 无码视频在线观看| 蜜臀久久99精品久久久画质超高清| 国产成人精品久久久| 波多野结衣黄色网址| 日韩黄色免费网站| 国产一区视频在线| 国产av无码专区亚洲a∨毛片| 国产精品18久久久久久久久 | 国产福利在线免费| 99精品国产九九国产精品| 欧美一区二区三区喷汁尤物| 午夜激情视频网| 日韩一区二区三区高清在线观看| 欧美成人性战久久| 真人bbbbbbbbb毛片| 美女毛片一区二区三区四区| 一区二区欧美激情| 翔田千里88av中文字幕| 怡红院精品视频在线观看极品| 国语自产精品视频在线看| 午夜影院免费在线观看 | 手机av在线网站| www.久久东京| 亚洲天堂网站在线观看视频| 午夜激情福利电影| 好看的亚洲午夜视频在线| 日本免费久久高清视频| 国产熟女一区二区三区四区| 成人激情av网| 亚洲高清精品中出| 黄色在线看片| 日本国产一区二区| 91香蕉国产线在线观看| 免费成人高清在线视频theav| 在线看片第一页欧美| 久草视频免费在线播放| 久久精品30| 69堂成人精品视频免费| 精品久久久久一区二区三区 | 亚洲在线资源| 亚洲精品美女视频| 永久免费未视频| 国产日韩亚洲| 91久久偷偷做嫩草影院| 国产一级在线| 亚洲444eee在线观看| 国产精品自在自线| 日韩激情网站| 欧美日韩国产999| 日韩精品在线一区二区三区| 成人免费福利片| 综合操久久久| 四虎4545www精品视频| 精品国产免费视频| 色偷偷男人天堂| 亚洲一区网站| 国产视频一区二区三区四区| 成人福利在线| 粉嫩av一区二区三区免费野| 超碰人人cao| 日韩精品dvd| 国产成人高潮免费观看精品| 日日躁夜夜躁白天躁晚上躁91| 综合色中文字幕| 久草福利视频在线| 亚洲国产欧美日韩在线观看第一区| 超碰日本道色综合久久综合| 自拍偷拍色综合| 久久久久国产精品厨房| 日韩xxxx视频| 伊色综合久久之综合久久| www国产精品视频| 进去里视频在线观看| 91亚洲精品久久久蜜桃网站 | 精品亚洲免费视频| 亚洲精品一区二区三区蜜桃久| 日韩伦理在线| 亚洲精品久久久久国产| 精品人妻在线播放| 国产成人在线视频网址| 在线观看三级网站| 精品一区二区三区亚洲| 精品国产区一区二区三区在线观看| 中文字幕人妻一区二区在线视频| 久久久精品国产免费观看同学| 男人天堂999| 亚洲va久久久噜噜噜久久| 26uuu亚洲国产精品| 天堂中文在线官网| 午夜成人免费视频| 国产高清自拍视频| 六月丁香综合| 日韩免费毛片| 日本久久久久| 久久福利视频导航| 亚洲国产欧美另类| 亚洲成人免费av| 中出视频在线观看| 美女被久久久| 日本不卡一区| 人人玩人人添人人澡欧美| 久久精品视频播放| 囯产精品久久久久久| 亚洲成人av电影| 亚洲天堂视频一区| 日本欧洲一区二区| 欧美日韩一区二区三区电影| 视频一区日韩精品| 97精品在线观看| 男女av在线| 555www色欧美视频| 国产在线免费视频| 2020国产精品久久精品美国| 国产自偷自偷免费一区 | 成人丝袜高跟foot| 久久久久久久久久久福利| 精品日产免费二区日产免费二区| 国产欧洲精品视频| 黄色美女视频在线观看| 亚洲精品网址在线观看| 一卡二卡在线观看| 亚洲国产日韩av| 久久久精品成人| 国产1区2区3区精品美女| www.com毛片| 亚洲h色精品| 久久精品magnetxturnbtih| 久久影视中文粉嫩av| 国产中文在线观看| 337p亚洲精品色噜噜狠狠| 日韩 欧美 精品| 欧美国产乱子伦| www.四虎精品| 蜜芽一区二区三区| 国产精品专区在线| 久久理论电影| 免费试看一区| 中文字幕久久精品一区二区| 国产精品电影网| 草美女在线观看| 中文字幕精品一区久久久久| 国产成人三级在线观看视频| 欧美视频你懂的| 国产精品黄色大片| 亚洲美女屁股眼交| 精品熟妇无码av免费久久| jvid福利写真一区二区三区| 日韩欧美国产片| 美女视频一区免费观看| 欧美黄网在线观看| 日韩精品永久网址| 精品中文字幕人| 一区二区三区四区精品视频| 国产精品视频一区二区三区四| 97蜜桃久久| 欧美美最猛性xxxxxx| 在线观看的av| 精品一区精品二区| 视频污在线观看| 91精品国产综合久久精品麻豆| 亚洲色图偷拍视频| 国产福利小视频| 亚洲最新视频在线观看| 人成免费在线视频| 久久久精品天堂| 这里只有精品在线观看视频| 国产麻豆视频精品| 高潮一区二区三区| 日本成人在线不卡视频| av片中文字幕| 中文精品在线| 国产日韩av网站| 精久久久久久| 男人草女人视频| 在线观看日韩| 欧美a级黄色大片| 久久久久久久久久久久久久久久久久 | 91精品网站在线观看| 国产精品h片在线播放| 涩涩视频在线播放| 69精品小视频| 乡村艳史在线观看| 欧美伊久线香蕉线新在线| 嗯啊主人调教在线播放视频| 久久免费成人精品视频| 暖暖在线中文免费日本| 欧美黄色小视频| 97人澡人人添人人爽欧美| 久久久噜噜噜久久久| 高清毛片在线观看| 欧美一区二三区| 伊人久久国产| 国产精品r级在线| 国产精品99精品一区二区三区∴| 国产精品视频网址| av在线精品| 91精品天堂| 大伊香蕉精品在线品播放| 国产精品露出视频| 亚洲第一福利社区| 视频一区免费观看| 午夜精品久久久久久久四虎美女版| 99精品一区二区三区的区别| 欧美在线首页| 国产毛片视频网站| 久久久久一区| 久久久精品高清| 成人免费视频免费观看| 欧美做受喷浆在线观看| 国产女主播在线一区二区| 亚洲欧美另类日本| 一级中文字幕一区二区| 久久精品一二区| 精品视频在线视频| www久久久com| 日韩电影免费观看中文字幕| 国产在线日本| 美日韩精品免费观看视频| 不卡一本毛片| 国产精品第二页| 97超碰成人| 日韩hmxxxx| 国产精品草草| 韩国视频一区二区三区| 国产成人精品一区二区三区四区| 无码人妻aⅴ一区二区三区| 国产精品免费人成网站| 久视频在线观看| 91国偷自产一区二区三区观看| 波多野结衣家庭主妇| 欧美va亚洲va| 最新av网站在线观看| 日韩欧美一二三区| 无码精品人妻一区二区三区影院| 亚洲男人天堂久| 精品欧美色视频网站在线观看| 国内久久久精品| 国产精品成人国产| 精品国产乱码久久久久久蜜柚 | 国产高清精品网站| 瑟瑟视频在线观看| 亚洲黄色av一区| jizz国产在线| 亚洲成人性视频| 黄色视屏免费在线观看| 欧洲成人午夜免费大片| 亚洲天堂av资源在线观看| 视频一区视频二区视频| 亚洲日本视频| 麻豆传媒在线看| 欧美激情一二三区| 日韩精品一区二区三| 91精品免费在线| www.国产精品.com| 欧美最顶级丰满的aⅴ艳星| 日韩三级网址| 亚洲第一精品区| 青青青伊人色综合久久| 国产麻豆天美果冻无码视频| 伊人婷婷欧美激情| 国产精品国产av| 中文字幕欧美日韩| 午夜日韩成人影院| 欧美不卡福利| 99精品热6080yy久久| 少妇献身老头系列| 亚洲免费在线视频一区 二区| 欧美高清69hd| 亚洲网站在线观看| 日本免费久久| 久久青青草原| 性欧美精品高清| 真人bbbbbbbbb毛片| 欧美日韩国产精品一区二区三区四区 | 久久激情综合网| 99久久99久久精品免费| 欧洲在线/亚洲| 国产三级视频在线| 国产精品成av人在线视午夜片 | 欧产日产国产69| 亚洲女人初尝黑人巨大| 天天免费亚洲黑人免费| 欧美中日韩免费视频| 久久久久久色| 大胸美女被爆操| 欧美日韩精品一区二区三区四区 | 成人爽a毛片一区二区| 欧美国产乱视频| 欧美电影免费网站| 妺妺窝人体色www在线小说| 99re免费视频精品全部| 欧美日韩精品区| 亚洲裸体xxxx| 91九色综合| 色乱码一区二区三区熟女| 国产呦萝稀缺另类资源| 九九视频在线观看| 亚洲成年人在线| 亚洲欧美se| 日韩精品第一页| 国内精品久久久久影院薰衣草| 欧美偷拍第一页| 精品成a人在线观看| 最近在线中文字幕| 相泽南亚洲一区二区在线播放| 久久精品国产一区二区三区免费看| 一级性生活免费视频| 日韩精品一区二区三区蜜臀 | 欧美性极品xxxx娇小| 国产最新视频在线观看| 国产精品爽爽ⅴa在线观看| 在线免费观看日本欧美爱情大片| 91超薄肉色丝袜交足高跟凉鞋| 欧美午夜宅男影院在线观看| 成人高清免费观看mv| 亚洲free性xxxx护士hd| 亚洲精品美女91| 亚洲欧洲综合网| 欧美精品一区二区久久久| 台湾佬成人网| 波多野结衣 作品| 久久一区二区三区国产精品| 亚洲手机在线观看| 国内免费久久久久久久久久久| sdde在线播放一区二区| 精品久久久99| 五月天亚洲婷婷| 免费成人黄色| 精品免费二区三区三区高中清不卡| 日本vs亚洲vs韩国一区三区二区 | 欧美日韩在线一区二区| 欧美14一18处毛片| 亚洲成人在线视频网站| 成人免费电影视频| 国产在成人精品线拍偷自揄拍| 97精品国产97久久久久久春色| 99热在线成人| 亚洲精品成人无码熟妇在线|