7

我正在使用 SwiftUI 2 中的新照片选择器,我制作了一个简单的应用程序来在 LazyVGrid 中显示导入的图像,但是当我向下滚动时,如果我导入了大约 150 张图像,应用程序会完成所有内存并崩溃(由于终止到内存问题)。

我对 LazyVStack 和 List 进行了同样的尝试,但它们有同样的问题,我期待惰性项会从内存中释放所有离开屏幕的单元格,但它看起来不像在工作。

这是一个错误还是我做错了什么?

这是我的代码:

import SwiftUI

struct Media: Identifiable {
    var id = UUID()
    var image: Image
}

struct ContentView: View {
    @State var itemProviders: [NSItemProvider] = []

    @State private var showingPhotoPicker: Bool = false
    
    let columns = [
        GridItem(.adaptive(minimum: 100, maximum: 100), spacing: 8)
    ]
    
    @State var medias: [Media] = []
    
    var body: some View {
        NavigationView {
            ScrollView {
                LazyVGrid(columns: columns, spacing: 8) {
                    ForEach(medias) { media in
                        media.image
                            .resizable()
                            .scaledToFill()
                            .frame(width: 100, height: 100, alignment: .center)
                            .clipped()
                    }
                }
            }
            .navigationBarTitle("Images \(medias.count)")
            .navigationBarItems(leading: Button(action: {
                loadImages()
            }, label: {
                Text("Import \(itemProviders.count) images")
            }), trailing: Button(action: {
                showingPhotoPicker.toggle()
            }, label: {
                Image(systemName: "photo.on.rectangle.angled")
            }))
            .sheet(isPresented: $showingPhotoPicker) {
                MultiPHPickerView(itemProviders: $itemProviders)
            }
        }
        
    }
    
    func loadImages() {
        for item in itemProviders {
            if item.canLoadObject(ofClass: UIImage.self) {
                item.loadObject(ofClass: UIImage.self) { image, error in
                    DispatchQueue.main.async {
                        guard let image = image as? UIImage else {
                            return
                        }
                        medias.append(Media(image: Image(uiImage: image)))
                    }
                }
            }
        }
    }
}

和 PhotoPickerView:

import SwiftUI
import PhotosUI

struct MultiPHPickerView: UIViewControllerRepresentable {
    
    @Environment(\.presentationMode) private var presentationMode
    
    @Binding var itemProviders: [NSItemProvider]
    
    func makeCoordinator() -> Coordinator {
        Coordinator(self)
    }
    
    func makeUIViewController(context: Context) -> PHPickerViewController {
     
        var configuration = PHPickerConfiguration()
        configuration.filter = .images
        configuration.selectionLimit = 0
        
        let controller = PHPickerViewController(configuration: configuration)
        controller.delegate = context.coordinator
        return controller
        
    }
    
    func updateUIViewController( _ uiViewController: PHPickerViewController, context: Context) {}
    
    
    class Coordinator: NSObject, PHPickerViewControllerDelegate {
        
        @Environment(\.presentationMode)  private var presentationMode
        
        var parent: MultiPHPickerView
        
        init( _ parent: MultiPHPickerView ) {
            self.parent = parent
        }
        
        func picker(_ picker: PHPickerViewController, didFinishPicking results: [PHPickerResult]) {
            
            picker.dismiss( animated: true )
            
            self.parent.itemProviders = results.map(\.itemProvider)
        }
    }
    
}
4

0 回答 0