more optimisation using a hash map

This commit is contained in:
neon443
2025-11-02 22:06:09 +00:00
parent 14d61dc45e
commit edaa0953c7
3 changed files with 15 additions and 9 deletions

View File

@@ -32,7 +32,7 @@ class EmojiHoarder: ObservableObject {
print("start loading remote db") print("start loading remote db")
await self.loadRemoteDB() await self.loadRemoteDB()
print("start local emojis loading") print("start local emojis loading")
await self.loadLocalEmojis() await self.findLocalEmojis()
print("end") print("end")
} }
} }
@@ -47,7 +47,7 @@ class EmojiHoarder: ObservableObject {
await withTaskGroup { group in await withTaskGroup { group in
for i in emojis.indices { for i in emojis.indices {
group.addTask { group.addTask {
guard await self.emojis[i].isLocal else { return } guard await self.localEmojis.contains(self.emojis[i]) else { return }
await self.emojis[i].deleteImage() await self.emojis[i].deleteImage()
DispatchQueue.main.sync { DispatchQueue.main.sync {
self.emojis[i].refresh() self.emojis[i].refresh()
@@ -58,7 +58,7 @@ class EmojiHoarder: ObservableObject {
} }
nonisolated nonisolated
func loadLocalEmojis() async { func findLocalEmojis() async {
let filteredSetted = await Set(self.emojis.filter { $0.isLocal }) let filteredSetted = await Set(self.emojis.filter { $0.isLocal })
await MainActor.run { await MainActor.run {
self.localEmojis = filteredSetted self.localEmojis = filteredSetted
@@ -74,6 +74,7 @@ class EmojiHoarder: ObservableObject {
try! data.write(to: EmojiHoarder.localEmojiDB) try! data.write(to: EmojiHoarder.localEmojiDB)
} }
nonisolated
func loadLocalDB() -> [Emoji] { func loadLocalDB() -> [Emoji] {
if let localEmojiDB = try? Data(contentsOf: EmojiHoarder.localEmojiDB) { if let localEmojiDB = try? Data(contentsOf: EmojiHoarder.localEmojiDB) {
let decoded = try! decoder.decode([Emoji].self, from: localEmojiDB) let decoded = try! decoder.decode([Emoji].self, from: localEmojiDB)
@@ -136,9 +137,9 @@ class EmojiHoarder: ObservableObject {
case .none: case .none:
fallthrough fallthrough
case .downloaded: case .downloaded:
withAnimation(.interactiveSpring) { self.filteredEmojis = self.filteredEmojis.filter { $0.isLocal } } withAnimation(.interactiveSpring) { self.filteredEmojis = self.filteredEmojis.filter { self.localEmojis.contains($0) } }
case .notDownloaded: case .notDownloaded:
withAnimation(.interactiveSpring) { self.filteredEmojis = self.filteredEmojis.filter { !$0.isLocal } } withAnimation(.interactiveSpring) { self.filteredEmojis = self.filteredEmojis.filter { !self.localEmojis.contains($0) } }
} }
} }
} }

View File

@@ -46,7 +46,10 @@ struct ContentView: View {
ForEach($hoarder.filteredEmojis, id: \.self) { $emoji in ForEach($hoarder.filteredEmojis, id: \.self) { $emoji in
HStack { HStack {
EmojiPreview(emoji: emoji) EmojiPreview(
hoarder: hoarder,
emoji: emoji
)
.frame(maxWidth: 100, maxHeight: 100) .frame(maxWidth: 100, maxHeight: 100)
Spacer() Spacer()
Button("", systemImage: "checkmark") { Button("", systemImage: "checkmark") {
@@ -61,7 +64,7 @@ struct ContentView: View {
} }
} }
.buttonStyle(.plain) .buttonStyle(.plain)
if emoji.isLocal { if hoarder.localEmojis.contains(emoji) {
Button("", systemImage: "trash") { Button("", systemImage: "trash") {
emoji.deleteImage() emoji.deleteImage()
emoji.refresh() emoji.refresh()
@@ -78,7 +81,7 @@ struct ContentView: View {
} }
} }
.swipeActions(edge: .trailing, allowsFullSwipe: true) { .swipeActions(edge: .trailing, allowsFullSwipe: true) {
if emoji.isLocal { if hoarder.localEmojis.contains(emoji) {
Button("Remove", systemImage: "trash") { Button("Remove", systemImage: "trash") {
emoji.deleteImage() emoji.deleteImage()
emoji.refresh() emoji.refresh()

View File

@@ -9,6 +9,7 @@ import SwiftUI
import Haptics import Haptics
struct EmojiPreview: View { struct EmojiPreview: View {
@ObservedObject var hoarder: EmojiHoarder
@State var emoji: Emoji @State var emoji: Emoji
@State private var id: UUID = UUID() @State private var id: UUID = UUID()
@@ -17,7 +18,7 @@ struct EmojiPreview: View {
VStack(alignment: .leading) { VStack(alignment: .leading) {
Text(emoji.name) Text(emoji.name)
Group { Group {
if emoji.isLocal { if hoarder.localEmojis.contains(emoji) {
Image(uiImage: emoji.image ?? UIImage()) Image(uiImage: emoji.image ?? UIImage())
.resizable().scaledToFit() .resizable().scaledToFit()
.border(.orange) .border(.orange)
@@ -62,6 +63,7 @@ struct EmojiPreview: View {
#Preview { #Preview {
EmojiPreview( EmojiPreview(
hoarder: EmojiHoarder(localOnly: true),
emoji: Emoji( emoji: Emoji(
name: "s?", name: "s?",
url: URL(string: "https://neon443.github.io/images/fav.ico")! url: URL(string: "https://neon443.github.io/images/fav.ico")!