Swift 5.5:异步逐行迭代文件

M.J*_*J.K 2 macos foundation wwdc swift swift5.5

WWDC2021 28:00“Platforms State of the Union”视频中提到

[Apple] 甚至增加了对文件的异步逐行迭代的支持

在 macOS 12/iOS 15 和 Swift 5.5 的基础中。

那个新 API 是什么,我现在如何通过文件异步逐行迭代?

Swe*_*per 7

他们添加的主要内容是AsyncSequence. AsyncSequence就像Sequence,但它的Iterator.next方法是async throws

具体来说,您可以使用URLSession.AsyncBytes.lines获取AsyncSequence文件中的某一行。

假设你在一个async throws方法中,你可以这样做:

let (bytes, response) = try await URLSession.shared.bytes(from: URL(string: "file://...")!)
for await line in bytes.lines {
    // do something...
}
Run Code Online (Sandbox Code Playgroud)

请注意,还有FileHandle.AsyncBytes.lines,但在文档中它说:

而不是创建一个FileHandle读取文件异步,你可以改用file://网址联合在异步的await方法URLSession。这些包括传递异步字节序列以及立即返回文件的全部内容的bytes(for:delegate:)bytes(from:delegate:)方法。data(for:delegate:)data(from:delegate:)