如何将 ShareLink 与异步函数中的项目一起使用?

Ori*_* C. 6 async-await swiftui sharelink swiftui-sharelink

我想使用 ShareLink 共享通过异步函数的 API 调用生成的 URL。

\n

我尝试过类似的方法,但它不起作用:

\n
ShareLink (item: Task {await getSharingURL()} ) \n   { Image(systemName: "square.and.arrow.up") } \n
Run Code Online (Sandbox Code Playgroud)\n

在苹果的文档中他们说:

\n
\n

有时,您的应用共享的内容\xe2\x80\x99 无法立即可用。当您需要异步操作(例如网络请求)来检索和准备内容时,可以使用 FileRepresentation 或 DataRepresentation。

\n
\n

https://developer.apple.com/documentation/SwiftUI/ShareLink

\n

但我不确定如何使用它,并且希望有任何例子。

\n

AVS*_*AVS 2

我是这样解决的。

我创建了一个可共享的模型,无论我想要为其创建链接的对象是什么。向其传递创建 url 所需的任何参数。

struct ShareableObject {

    ...

    func shareURL() async -> Data? {
        guard let shortURL = fetch() else {
            return "example.com".data(using: .utf8)
        }
        return shortURL.data(using: .utf8)
    }
}
Run Code Online (Sandbox Code Playgroud)

您将需要定义该fetch()函数。

然后我让它符合Transferable,特别是使用DataRepresentation,以便它可以异步处理。

extension ShareableObject: Transferable {
    enum ShareError: Error {
        case failed
    }
    
    static var transferRepresentation: some TransferRepresentation {
        DataRepresentation(exportedContentType: .plainText) { object in
            guard let data = await object.shareURL() else {
                throw ShareError.failed
            }
            return data
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后要部署它,您只需将其ShareableObject放在ShareLink...

ShareLink(item: shareableObject()) {
    Label("Share This Thing", systemImage: "square.and.arrow.up")
}
Run Code Online (Sandbox Code Playgroud)

可能有更简洁的抽象。如果是这样,我很乐意在评论或第二个答案中获得反馈。