成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Swift AsyncSequence — 代碼實例詳解

開發 架構
AsyncSequence 是并發性框架和SE-298[1] 提案的一部分。它的名字意味著它是一個提供異步、順序和迭代訪問其元素的類型。換句話說:它是我們在 Swift 中熟悉的常規序列的一個異步變體。

前言

AsyncSequence 是并發性框架和SE-298[1] 提案的一部分。它的名字意味著它是一個提供異步、順序和迭代訪問其元素的類型。換句話說:它是我們在 Swift 中熟悉的常規序列的一個異步變體。

就像你不會經常創建你的自定義序列一樣,我不期望你經常創建一個自定義的 AsyncSequence 實現。然而,由于與 AsyncThrowingStream和AsyncStream 等類型一起使用,你很可能不得不與異步序列一起工作。因此,我將指導你使用 AsyncSequence 實例進行工作。

什么是 AsyncSequence?

AsyncSequence 是我們在Swift中熟悉的 Sequence 的一個異步變體。由于它的異步性,我們需要使用 await 關鍵字,因為我們要處理的是異步定義的方法。如果你沒有使用過 async/await,我鼓勵你閱讀我的文章:Swift 中的async/await ——代碼實例詳解

值可以隨著時間的推移而變得可用,這意味著一個 AsyncSequence 在你第一次使用它時可能不包含也可能包含一些,或者全部的值。

重要的是要理解 AsyncSequence 只是一個協議。它定義了如何訪問值,但并不產生或包含值。AsyncSequence 協議的實現者提供了一個 AsyncIterator,并負責開發和潛在地存儲值。

創建 AsyncSequence

創建一個自定義的 AsyncSequence。

為了更好地理解 AsyncSequence 是如何工作的,我將演示一個實現實例。然而,在定義你的 AsyncSequence 的自定義實現時,你可能想用 AsyncStream 來代替,因為它的設置更方便。因此,這只是一個代碼例子,以更好地理解 AsyncSequence 的工作原理。

下面的例子沿用了原始提案中的例子,實現了一個計數器。這些值可以立即使用,所以對異步序列沒有太大的需求。然而,它確實展示了一個異步序列的基本結構:

struct Counter: AsyncSequence {
typealias Element = Int

let limit: Int

struct AsyncIterator : AsyncIteratorProtocol {
let limit: Int
var current = 1
mutating func next() async -> Int? {
guard !Task.isCancelled else {
return nil
}

guard current <= limit else {
return nil
}

let result = current
current += 1
return result
}
}

func makeAsyncIterator() -> AsyncIterator {
return AsyncIterator(howHigh: limit)
}
}

如您所見,我們定義了一個實現 AsyncSequence 協議的 Counter 結構體。該協議要求我們返回一個自定義的 AsyncIterator,我們使用內部類型解決了這個問題。我們可以決定重寫此示例以消除對內部類型的需求:

struct Counter: AsyncSequence, AsyncIteratorProtocol {
typealias Element = Int

let limit: Int
var current = 1

mutating func next() async -> Int? {
guard !Task.isCancelled else {
return nil
}

guard current <= limit else {
return nil
}

let result = current
current += 1
return result
}

func makeAsyncIterator() -> Counter {
self
}
}

我們現在可以將 self 作為迭代器返回,并保持所有邏輯的集中。

注意,我們必須通過提供 typealias 來幫助編譯器遵守 AsyncSequence 協議。

next() 方法負責對整體數值進行迭代。我們的例子歸結為提供盡可能多的計數值,直到我們達到極限。我們通過對 Task.isCancelled 的檢查來實現取消支持。

異步序列的迭代

現在我們知道了什么是 AsyncSequence 以及它是如何實現的,現在是時候開始迭代這些值了。

以上述例子為例,我們可以使用 Counter 開始迭代:

for await count in Counter(limit: 5) {
print(count)
}
print("Counter finished")

// Prints:
// 1
// 2
// 3
// 4
// 5
// Counter finished

我們必須使用 await 關鍵字,因為我們可能會異步接收數值。一旦不再有預期的值,我們就退出for循環。異步序列的實現者可以通過在 next() 方法中返回 nil 來表示達到極限。在我們的例子中,一旦計數器達到配置的極限,或者迭代取消,我們就會達到這個預期:

mutating func next() async -> Int? {
guard !Task.isCancelled else {
return nil
}

guard current <= limit else {
return nil
}

let result = current
current += 1
return result
}

許多常規的序列操作符也可用于異步序列。其結果是,我們可以以異步的方式執行映射和過濾等操作。

例如,我們可以只對偶數進行過濾:

for await count in Counter(limit: 5).filter({ $0 % 2 == 0 }) {
print(count)
}
print("Counter finished")

// Prints:
// 2
// 4
// Counter finished

或者我們可以在迭代之前將計數映射為一個 String :

let counterStream = Counter(limit: 5)
.map { $0 % 2 == 0 ? "Even" : "Odd" }
for await count in counterStream {
print(count)
}
print("Counter finished")

// Prints:
// Odd
// Even
// Odd
// Even
// Odd
// Counter finished

我們甚至可以使用 AsyncSequence 而不使用for循環,通過使用 contains 等方法。

let contains = await Counter(limit: 5).contains(3)
print(contains) // Prints: true

注意,上述方法是異步的,意味著它有可能無休止地等待一個值的存在,直到底層的 AsyncSequence 完成。

結論

AsyncSequence 是我們在Swift中熟悉的常規 Sequence 的異步替代品。就像你不會經常自己創建一個自定義 Sequence 一樣,你也不太可能創建自定義的異步序列。

參考資料

[1]SE-298: https://github.com/apple/swift-evolution/blob/main/proposals/0298-asyncsequence.md

責任編輯:武曉燕 來源: Swift社區
相關推薦

2023-02-08 09:01:42

Swift元素流

2022-11-21 09:01:00

Swift并發結構

2009-09-02 17:12:06

C#關機代碼

2022-10-10 09:00:29

SendableSwift

2009-07-09 15:05:45

Servlet實例

2024-02-02 09:04:23

VueKeepAlive緩存組件

2010-01-05 13:54:58

交換機配置VLAN

2012-07-12 16:00:32

OpenStackSwift架構

2014-07-25 15:03:33

Linuxshellsed

2009-06-11 08:59:35

2022-01-16 08:00:28

PythonFor循環

2009-06-10 14:53:25

netbeans st實例

2010-06-22 10:28:04

linux at命令

2011-06-24 14:34:17

Qt 小票 打印

2011-03-09 09:11:52

java反射機制

2012-07-27 10:30:12

重構

2015-08-25 11:17:13

OpenStack對象存儲Swift

2009-09-23 10:28:49

使用Hibernate

2022-08-10 09:02:08

SwiftDecodable

2022-01-17 11:25:46

代碼Pythonfor
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 韩日精品一区 | 亚洲精品不卡 | 中文字幕一区二区三区四区五区 | 国产成人av在线 | 中文字幕日本一区二区 | 国产精品久久av | 精品一区二区三区在线视频 | 亚洲精品视频三区 | 久久国产亚洲 | 久久精品亚洲精品 | 午夜在线小视频 | 久久久亚洲一区 | 久久久久国产一区二区三区四区 | 成人欧美一区二区三区在线播放 | 99精品网| 精品无码久久久久久国产 | 中文字幕一区二区三区不卡 | 91精品在线播放 | 国产精品一区二区三区在线 | 国产欧美精品一区二区色综合朱莉 | 中文字幕在线视频观看 | 国产成人精品免费 | 亚洲成人国产 | 国产成人综合一区二区三区 | 91精品一区二区三区久久久久 | 中文字幕一区在线观看视频 | 一区二区高清 | 欧美久久精品一级黑人c片 91免费在线视频 | 欧美精品一二区 | 91伦理片 | 国产在线一区观看 | 欧美在线观看黄色 | 一本大道久久a久久精二百 国产成人免费在线 | 国产美女特级嫩嫩嫩bbb片 | 国产精品美女 | 国产精品99久久久久 | 男人的天堂中文字幕 | 日本视频在线播放 | 午夜小影院 | 亚洲日韩中文字幕 | 成人a视频片观看免费 |