From 9b6d91bf8fd1162ac671d8d49894d9c9aaa476a7 Mon Sep 17 00:00:00 2001 From: neon443 <69979447+neon443@users.noreply.github.com> Date: Tue, 28 Oct 2025 20:30:32 +0000 Subject: [PATCH] =?UTF-8?q?fixed=20massive=20performance=20issue!!!!=20emo?= =?UTF-8?q?ji.image=20is=20a=20computed=20property=20made=20it=20not=20cra?= =?UTF-8?q?sh=20if=20it=20couldnt=20access=20cachet=20=F0=9F=98=AD=20added?= =?UTF-8?q?=20search=20and=20a=20counter=20removed=20emojipreview.image?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- StickerSlack/Emoji/Emoji.swift | 16 ++++++++-------- StickerSlack/EmojiHoarder.swift | 3 ++- StickerSlack/Views/ContentView.swift | 21 +++++++++------------ StickerSlack/Views/EmojiPreview.swift | 22 ++++++++++++---------- 4 files changed, 31 insertions(+), 31 deletions(-) diff --git a/StickerSlack/Emoji/Emoji.swift b/StickerSlack/Emoji/Emoji.swift index 560dea8..ec9db62 100644 --- a/StickerSlack/Emoji/Emoji.swift +++ b/StickerSlack/Emoji/Emoji.swift @@ -20,7 +20,14 @@ struct Emoji: Codable, Identifiable, Hashable { return (try? Data(contentsOf: localImageURL)) != nil } - var image: UIImage? + var image: UIImage? { + if let data = try? Data(contentsOf: localImageURL), + let img = UIImage(data: data) { + return img + } else { + return nil + } + } enum CodingKeys: String, CodingKey { case id = "id" @@ -36,13 +43,6 @@ struct Emoji: Codable, Identifiable, Hashable { self.name = try container.decode(String.self, forKey: .name) self.localImageURL = try container.decode(URL.self, forKey: .localImageURL) self.remoteImageURL = try container.decode(URL.self, forKey: .remoteImageURL) - - if let data = try? Data(contentsOf: localImageURL), - let img = UIImage(data: data) { - self.image = img - } else { - self.image = nil - } } init( diff --git a/StickerSlack/EmojiHoarder.swift b/StickerSlack/EmojiHoarder.swift index 2c2a6c4..3e694d3 100644 --- a/StickerSlack/EmojiHoarder.swift +++ b/StickerSlack/EmojiHoarder.swift @@ -28,6 +28,7 @@ class EmojiHoarder: ObservableObject { } self.emojis = fetched + self.filteredEmojis = fetched } func storeStickers(_ toStore: [UUID]) { @@ -49,7 +50,7 @@ class EmojiHoarder: ObservableObject { } func fetchRemoteDB() -> [Emoji]? { - guard let data = try? Data(contentsOf: endpoint) else { fatalError("cachet unreachable") } + guard let data = try? Data(contentsOf: endpoint) else { return nil } decoder.dateDecodingStrategy = .iso8601 let decoded: [SlackResponse] = try! decoder.decode([SlackResponse].self, from: data) return SlackResponse.toEmojis(from: decoded) diff --git a/StickerSlack/Views/ContentView.swift b/StickerSlack/Views/ContentView.swift index 251b1b8..cd0da77 100644 --- a/StickerSlack/Views/ContentView.swift +++ b/StickerSlack/Views/ContentView.swift @@ -17,20 +17,18 @@ struct ContentView: View { NavigationView { TabView { List { - HStack { - TextField("", text: $searchTerm) { - hoarder.filterEmojis(by: searchTerm) - } - - .autocorrectionDisabled() - .textFieldStyle(.roundedBorder) -// Button("downloaded", systemImage: "arrow.down.circle.fill") { -// <#code#> -// } + TextField("", text: $searchTerm) { + hoarder.filterEmojis(by: searchTerm) } + + .autocorrectionDisabled() + .textFieldStyle(.roundedBorder) + + Text("\(hoarder.filteredEmojis.count) Emoji") + ForEach($hoarder.filteredEmojis, id: \.self) { $emoji in HStack { - EmojiPreview(emoji: emoji, image: emoji.image) + EmojiPreview(emoji: emoji) .frame(maxWidth: 100) Spacer() if emoji.isLocal { @@ -48,7 +46,6 @@ struct ContentView: View { .buttonStyle(.plain) } } - .id(emoji.uiID) .swipeActions(edge: .trailing, allowsFullSwipe: true) { if emoji.isLocal { Button("Remove", systemImage: "trash") { diff --git a/StickerSlack/Views/EmojiPreview.swift b/StickerSlack/Views/EmojiPreview.swift index c71cd74..be01a06 100644 --- a/StickerSlack/Views/EmojiPreview.swift +++ b/StickerSlack/Views/EmojiPreview.swift @@ -12,7 +12,6 @@ struct EmojiPreview: View { @State var emoji: Emoji @State private var id: UUID = UUID() - @State var image: UIImage? = nil var body: some View { VStack { @@ -28,7 +27,6 @@ struct EmojiPreview: View { .resizable().scaledToFit() .frame(width: 20, height: 20) .symbolRenderingMode(.hierarchical) -// .foregroundStyle(.gray) } } else { AsyncImage(url: emoji.remoteImageURL) { phase in @@ -36,14 +34,18 @@ struct EmojiPreview: View { image .resizable().scaledToFit() } else if phase.error != nil { - Image(systemName: "xmark.app.fill") - .resizable().scaledToFit() - .padding() - .symbolRenderingMode(.hierarchical) - .foregroundStyle(.red) - .onTapGesture { - id = UUID() - } + ZStack { + + Image(systemName: "xmark.app.fill") + .resizable().scaledToFit() + .padding() + .padding() + .symbolRenderingMode(.hierarchical) + .foregroundStyle(.red) + .onTapGesture { + id = UUID() + } + } } else { ProgressView() }