Ori*_* C. 6 async-await swiftui sharelink swiftui-sharelink
我想使用 ShareLink 共享通过异步函数的 API 调用生成的 URL。
\n我尝试过类似的方法,但它不起作用:
\nShareLink (item: Task {await getSharingURL()} ) \n { Image(systemName: "square.and.arrow.up") } \nRun Code Online (Sandbox Code Playgroud)\n在苹果的文档中他们说:
\n\n\n有时,您的应用共享的内容\xe2\x80\x99 无法立即可用。当您需要异步操作(例如网络请求)来检索和准备内容时,可以使用 FileRepresentation 或 DataRepresentation。
\n
https://developer.apple.com/documentation/SwiftUI/ShareLink
\n但我不确定如何使用它,并且希望有任何例子。
\n我是这样解决的。
我创建了一个可共享的模型,无论我想要为其创建链接的对象是什么。向其传递创建 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)
可能有更简洁的抽象。如果是这样,我很乐意在评论或第二个答案中获得反馈。
| 归档时间: |
|
| 查看次数: |
512 次 |
| 最近记录: |