Проблема с распределением памяти с помощью LazyVGrid SwiftUI при отображении медиафайловIOS

Программируем под IOS
Ответить Пред. темаСлед. тема
Гость
 Проблема с распределением памяти с помощью LazyVGrid SwiftUI при отображении медиафайлов

Сообщение Гость »


Сейчас я работаю над приложением SwiftUI, которое отображает медиафайлы в сетке с помощью LazyVGrid в GalleryView, где в каждой строке будет по 3 медиафайла. Медиа-файлы загружаются из кэша приложения, а не из приложения «Фото» пользователя. Когда пользователь прокручивает вниз, чтобы увидеть больше медиаданных, медиафайлы лениво загружаются в память, а те, которые скрыты от просмотра, не освобождаются из памяти, поскольку LazyVGrid не имеет встроенного механизма освобождения памяти. Проблемы с памятью становятся более очевидными ( где n — количество медиафайлов), когда существует большое количество изображений или видео для отображения в GalleryView:

Код: Выделить всё

struct GalleryView: View {
@Binding var mediaFiles: [Media]
var body: some View {
GeometryReader { geometry in
ScrollView {
let width = geometry.size.width / 3 - 10
let gridItemLayout = [GridItem(.fixed(width)), GridItem(.fixed(width)), GridItem(.fixed(width))]
LazyVGrid(columns: gridItemLayout, spacing: 10) {
ForEach(mediaFiles, id: \.id) { media in
if let image = media.image {
Image(uiImage: image)
.resizable()
.scaledToFit()
.frame(width: width)
} else if let videoURL = media.videoURL {
// Display video thumbnail here
}
}
}
}
}
}
}

struct Media: Identifiable {
let id = UUID()
let creationTime: Date
var image: UIImage?
var videoURL: URL?
}
Я попробовал собственный подход UIKit для решения проблемы освобождения памяти:

Код: Выделить всё

struct CollectionView: UIViewControllerRepresentable {
typealias UIViewControllerType = UICollectionViewController

@Binding var mediaFiles: [Media]
var width: CGFloat

func makeUIViewController(context: Context) -> UICollectionViewController {
let layout = UICollectionViewFlowLayout()
layout.itemSize = CGSize(width: width / 3, height: width / 3)
layout.minimumLineSpacing = 10
layout.minimumInteritemSpacing = 10
let collectionViewController = UICollectionViewController(collectionViewLayout: layout)
collectionViewController.collectionView?.register(MediaCell.self, forCellWithReuseIdentifier: "cell")
collectionViewController.collectionView?.backgroundColor = .white
return collectionViewController
}

func updateUIViewController(_ uiViewController: UICollectionViewController, context: Context) {
uiViewController.collectionView?.dataSource = context.coordinator
uiViewController.collectionView?.delegate = context.coordinator
uiViewController.collectionView?.reloadData()
}

func makeCoordinator() -> Coordinator {
Coordinator(self)
}

class Coordinator: NSObject, UICollectionViewDataSource, UICollectionViewDelegate {
var parent: CollectionView

init(_ parent: CollectionView) {
self.parent = parent
}

func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return parent.mediaFiles.count
}

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! MediaCell
let media = parent.mediaFiles[indexPath.row]
if let image = media.image {
cell.imageView.image = image
}
return cell
}

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
// Handle selection here
}
}
}
чтобы я мог использовать CollectionView вместо LazyVGrid в GalleryView следующим образом:

Код: Выделить всё

CollectionView(mediaFiles: $mediaFiles, width: width)
.frame(width: geometry.size.width, height: geometry.size.height)
.onAppear {
model.loadMediaFiles()
if let lastMediaIndex = mediaFiles.indices.last {
scrollView.scrollTo(lastMediaIndex, anchor: .bottom)
}
}
But the custom UIKit code didn't work as expected because GalleryView now shows a blank white screen (on either light/dark mode) instead of showing 3 media items per row. I have also tried using List in place of LazyVGrid, or trying Chris C's code to optimize the memory complexity of the problem to O(1) but neither approach worked. I've also tried to chunk the data into pieces and create rows with more than one image as suggested in another thread by @baronfac. However, @baronfac's suggestion only optimizes the memory issue by from n to n/3, which this linear reduction doesn't really change the memory complexity of the problem since it's still O(n).
Is there a simple and intuitive way to deal with this absence of memory deallocation issue with LazyVGrid? If a UIKit implementation is the best approach, could someone help identify what’s wrong with my current UIKit code that’s causing the GalleryView to display a blank screen?


Источник: https://stackoverflow.com/questions/781 ... edia-files
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Проблема с распределением памяти с помощью LazyVGrid SwiftUI при отображении медиафайлов
    Anonymous » » в форуме IOS
    0 Ответы
    41 Просмотры
    Последнее сообщение Anonymous
  • Как я могу использовать LazyVGrid SwiftUI для создания карточек гибкой ширины в разных строках?
    Anonymous » » в форуме IOS
    0 Ответы
    36 Просмотры
    Последнее сообщение Anonymous
  • Проблема LazyVGrid и ScrollTo в SwiftUI
    Anonymous » » в форуме IOS
    0 Ответы
    34 Просмотры
    Последнее сообщение Anonymous
  • Swiftui LazyVgrid против пользовательского просмотра для выбираемых тегов (ошибка эффекта глюка)
    Anonymous » » в форуме IOS
    0 Ответы
    19 Просмотры
    Последнее сообщение Anonymous
  • Swiftui LazyVgrid против пользовательского просмотра для выбираемых тегов (ошибка эффекта глюка)
    Anonymous » » в форуме IOS
    0 Ответы
    16 Просмотры
    Последнее сообщение Anonymous

Вернуться в «IOS»