如何在 SwiftUI 中处理 ShareLink - 更新图像时出现内存泄漏?

问题描述 投票:0回答:1

我会尝试尽可能简单地解释这一点。我制作了一个根据用户操作修改 UIImage 的应用程序。

为了能够共享/保存生成的图像,我在视图中添加了一个共享链接。

每次用户对图像进行更改时,应用程序都会消耗永远不会释放的内存。

当我删除 ShareLink() 时,内存被释放并按预期工作。

我是否错过了有关 ShareLink() 工作原理的内容?我已经阅读了Apple文档,但我没有得到任何启发。

顺便说一句,我正在为我的控制器使用 @State 变量,这应该没问题,因为它不是 ObservableObject。

这是我的应用程序的基本结构,非常简化。

class ImageController() {
  func modifyImage(photo: UIImage?) -> async UIImage? {
    // do stuff here

    return resultingUIImage
  }
}

struct ContentView: View {
  @State private var photo: UIImage?
  @State private var imageController: ImageController()

  var body: some View {
    VStack {
      Image(uiImage: photo)

      HStack {
        Button("Modify the image") {
          Task {
            let newPhoto = await modifyImage(photo)
 
            DispatchQueue.main.async {
              self.photo = newPhoto
            }
          }
        }
        // when removing ShareLink() below the app doesn't leak memory
        ShareLink(item: Image(uiImage: photo), preview: SharePreview("Description", image: Image(uiImage: photo))
      }
    }
  }
}
swiftui async-await memory-leaks swiftui-sharelink
1个回答
0
投票

我现在已经解决了,但不确定这是否是正确的方法。这就是我所做的:

  1. 创建一个可共享对象:
struct ShareableJpeg {
    let imageData: Data
}

extension ShareableJpeg: Transferable {
    enum ShareError: Error {
        case failed
    }
    
    static var transferRepresentation: some TransferRepresentation {
        DataRepresentation(exportedContentType: .jpeg) { object in
            return object.imageData
        }
    }
}
  1. 创建一个保存图像的状态变量:
@State var shareableJpeg: ShareableJpeg?

  1. 实现 ShareLink():
ShareLink(item: shareableJpeg, preview: SharePreview("Description", image: Image("AppIcon"))) {
  Label("Share", systemImage: "square.and.arrow.up")
}
  1. 分配可共享Jpeg:
let resultingImage = await imageController.applyStuff(image)

if let jpegData = image.jpegData(compressionQuality: 0.9) {
    shareableJpeg = ShareableJpeg(imageData: jpegData)
}
© www.soinside.com 2019 - 2024. All rights reserved.