実現したいこと
ドキュメントディレクトリから取得した画像をListに表示させることは出来ましたが、
Listを何度かスクロールすると、メモリ消費が増えアプリが落ちる。
前提
ドキュメントディレクトリから画像を取得し、
その画像をListに表示させることは出来ました。
発生している問題・エラーメッセージ
Listを上下になんどもスクロールすると、アプリが落ちてしまします。
(メモリ消費が1GBを超えとても重くなって落ちます。)
Listの行の.onAppearに画像表示処理を書いている理由ですが、
今後行ごとに違う画像を表示する予定のため、ここに処理を書いています。
該当のソースコード
〜TestLlistView.swift〜
Swift
1import SwiftUI2 3struct TestLlistView: View {4 5 @State private var uiimage: UIImage? = UIImage(named: "tree")6 7 var body: some View {8 VStack {9 Button("ドキュメントディレクトリに画像を保存") {10 saveImage()11 }12 NavigationView {13 List {14 ForEach(0..<100) { index in15 Row()16 }17 }18 }19 }20 }21 22 func saveImage() {23 if let uiimage = self.uiimage {24 if let jpg = uiimage.jpegData(compressionQuality: 0.1) {25 let filename = getDocumentsDirectory().appendingPathComponent("a.jpg")26 do {27 try jpg.write(to: filename)28 } catch {29 print("Unable to write image data")30 }**ボールドテキスト**31 }32 }33 }34 35 func getDocumentsDirectory() -> URL {36 let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)37 return paths[0]38 }39}
〜Row.swift〜
Swift
1import SwiftUI2 3struct Row: View {4 5 @State private var imagePath: URL?6 @State private var uiimage: UIImage?7 8 var body: some View {9 HStack {10 if let uiimage = uiimage {11 Image(uiImage: uiimage)12 .resizable()13 .scaledToFit()14 .frame(width: 100, height: 100)15 } else {16 ProgressView()17 .frame(width: 100, height: 100)18 }19 }20 .onAppear {21 // ドキュメントディレクトリから画像を取得し表示22 Task {23 if let documentsDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first {24 let imageUrl = documentsDirectory.appendingPathComponent(String("a.jpg"))25 if let image = UIImage(contentsOfFile: imageUrl.path) {26 self.uiimage = image 27 }28 }29 }30 }31 }32 33 func getDocumentsDirectory() -> URL {34 let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)35 return paths[0]36 }37}
試したこと
・画像を非同期で取得していますが、非同期でなくても、アプリが落ちてしまいました。
・realmに画像をバイナリで保存して、LIstに表示する時に画像に変換して表示させる方法も
試しましたが、メモリ消費が増えアプリが落ちました。

0 コメント