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")
await self.loadRemoteDB()
print("start local emojis loading")
await self.loadLocalEmojis()
await self.findLocalEmojis()
print("end")
}
}
@@ -47,7 +47,7 @@ class EmojiHoarder: ObservableObject {
await withTaskGroup { group in
for i in emojis.indices {
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()
DispatchQueue.main.sync {
self.emojis[i].refresh()
@@ -58,7 +58,7 @@ class EmojiHoarder: ObservableObject {
}
nonisolated
func loadLocalEmojis() async {
func findLocalEmojis() async {
let filteredSetted = await Set(self.emojis.filter { $0.isLocal })
await MainActor.run {
self.localEmojis = filteredSetted
@@ -74,6 +74,7 @@ class EmojiHoarder: ObservableObject {
try! data.write(to: EmojiHoarder.localEmojiDB)
}
nonisolated
func loadLocalDB() -> [Emoji] {
if let localEmojiDB = try? Data(contentsOf: EmojiHoarder.localEmojiDB) {
let decoded = try! decoder.decode([Emoji].self, from: localEmojiDB)
@@ -136,9 +137,9 @@ class EmojiHoarder: ObservableObject {
case .none:
fallthrough
case .downloaded:
withAnimation(.interactiveSpring) { self.filteredEmojis = self.filteredEmojis.filter { $0.isLocal } }
withAnimation(.interactiveSpring) { self.filteredEmojis = self.filteredEmojis.filter { self.localEmojis.contains($0) } }
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
HStack {
EmojiPreview(emoji: emoji)
EmojiPreview(
hoarder: hoarder,
emoji: emoji
)
.frame(maxWidth: 100, maxHeight: 100)
Spacer()
Button("", systemImage: "checkmark") {
@@ -61,7 +64,7 @@ struct ContentView: View {
}
}
.buttonStyle(.plain)
if emoji.isLocal {
if hoarder.localEmojis.contains(emoji) {
Button("", systemImage: "trash") {
emoji.deleteImage()
emoji.refresh()
@@ -78,7 +81,7 @@ struct ContentView: View {
}
}
.swipeActions(edge: .trailing, allowsFullSwipe: true) {
if emoji.isLocal {
if hoarder.localEmojis.contains(emoji) {
Button("Remove", systemImage: "trash") {
emoji.deleteImage()
emoji.refresh()

View File

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