From c974e8136b2e1199771a228708f933a0a7a0af8c Mon Sep 17 00:00:00 2001 From: neon443 <69979447+neon443@users.noreply.github.com> Date: Thu, 30 Oct 2025 19:44:59 +0000 Subject: [PATCH] async let to parallelise stuff fix crash when the fetched db doesnt exist added loadremoteDB to asyncly fetch remotedb fixed Tasks not running on background threads remove expiration from slackresponse emoji.uiid starts out as emoji.id added filtering emojis test hopefully optimised the display of images checking if its local imessage extension ios 15+ remove the "hii!!" and "hello world" from the emojji picker --- StickerSlack.xcodeproj/project.pbxproj | 4 +- StickerSlack/Emoji/Emoji.swift | 5 +- StickerSlack/Emoji/SlackResponse.swift | 1 - StickerSlack/EmojiHoarder.swift | 48 +++++++++++-------- StickerSlack/Views/EmojiPreview.swift | 5 +- StickerSlackTests/StickerSlackTests.swift | 9 ++++ .../Base.lproj/MainInterface.storyboard | 11 ----- .../MessagesViewController.swift | 7 --- 8 files changed, 44 insertions(+), 46 deletions(-) diff --git a/StickerSlack.xcodeproj/project.pbxproj b/StickerSlack.xcodeproj/project.pbxproj index 1e9e074..d9a053f 100644 --- a/StickerSlack.xcodeproj/project.pbxproj +++ b/StickerSlack.xcodeproj/project.pbxproj @@ -663,7 +663,7 @@ INFOPLIST_FILE = StickerSlackiMessageExtension/Info.plist; INFOPLIST_KEY_CFBundleDisplayName = StickerSlackiMessageExtension; INFOPLIST_KEY_NSHumanReadableCopyright = ""; - IPHONEOS_DEPLOYMENT_TARGET = 26.0; + IPHONEOS_DEPLOYMENT_TARGET = 15; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -695,7 +695,7 @@ INFOPLIST_FILE = StickerSlackiMessageExtension/Info.plist; INFOPLIST_KEY_CFBundleDisplayName = StickerSlackiMessageExtension; INFOPLIST_KEY_NSHumanReadableCopyright = ""; - IPHONEOS_DEPLOYMENT_TARGET = 26.0; + IPHONEOS_DEPLOYMENT_TARGET = 15; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", diff --git a/StickerSlack/Emoji/Emoji.swift b/StickerSlack/Emoji/Emoji.swift index 6417068..4ed7c3c 100644 --- a/StickerSlack/Emoji/Emoji.swift +++ b/StickerSlack/Emoji/Emoji.swift @@ -13,13 +13,12 @@ import UniformTypeIdentifiers struct Emoji: Codable, Identifiable, Hashable { var id: UUID - var uiID: UUID = UUID() + var uiID: UUID var name: String var localImageURL: URL { let urlString = remoteImageURL.absoluteString let split = urlString.split(separator: ".") let fileExtension = ".\(split.last ?? "png")" -// return EmojiHoarder.container.appendingPathComponent(id.uuidString+fileExtension, conformingTo: .image) return URL(string: EmojiHoarder.container.absoluteString+id.uuidString+fileExtension)! } var remoteImageURL: URL @@ -53,6 +52,7 @@ struct Emoji: Codable, Identifiable, Hashable { init(from decoder: any Decoder) throws { let container = try decoder.container(keyedBy: CodingKeys.self) self.id = try container.decode(UUID.self, forKey: .id) + self.uiID = id self.name = try container.decode(String.self, forKey: .name) self.remoteImageURL = try container.decode(URL.self, forKey: .remoteImageURL) } @@ -62,6 +62,7 @@ struct Emoji: Codable, Identifiable, Hashable { id: UUID = UUID() ) { self.id = id + self.uiID = id self.name = apiEmoji.name self.remoteImageURL = apiEmoji.url } diff --git a/StickerSlack/Emoji/SlackResponse.swift b/StickerSlack/Emoji/SlackResponse.swift index b178432..9fbe1e5 100644 --- a/StickerSlack/Emoji/SlackResponse.swift +++ b/StickerSlack/Emoji/SlackResponse.swift @@ -13,7 +13,6 @@ struct SlackResponse: Identifiable, Codable { var name: String var imageUrl: String var alias: String? - var expiration: Date static func toEmojis(from response: [SlackResponse]?) -> [Emoji]? { guard let response else { return nil } diff --git a/StickerSlack/EmojiHoarder.swift b/StickerSlack/EmojiHoarder.swift index 4ab2520..5f5a1c7 100644 --- a/StickerSlack/EmojiHoarder.swift +++ b/StickerSlack/EmojiHoarder.swift @@ -25,11 +25,9 @@ class EmojiHoarder: ObservableObject { withAnimation { self.emojis = loadLocalDB() } withAnimation { self.filteredEmojis = self.emojis } - Task(priority: .high) { - if let fetched = await self.fetchRemoteDB() { - withAnimation { self.emojis = fetched } - withAnimation { self.filteredEmojis = fetched } - } + Task.detached { + print(Thread.current) + await self.loadRemoteDB() } } @@ -55,12 +53,20 @@ class EmojiHoarder: ObservableObject { return [] } + func loadRemoteDB() async { + async let fetched = self.fetchRemoteDB() + if let fetched = await fetched { + withAnimation { self.emojis = fetched } + withAnimation { self.filteredEmojis = fetched } + } + } + func fetchRemoteDB() async -> [Emoji]? { do { - let (data, _) = try await URLSession.shared.data(from: endpoint) + async let (data, _) = try URLSession.shared.data(from: endpoint) decoder.dateDecodingStrategy = .iso8601 - let decoded: [SlackResponse] = try! decoder.decode([SlackResponse].self, from: data) - storeDB(data: data) + let decoded: [SlackResponse] = try decoder.decode([SlackResponse].self, from: await data) + try storeDB(data: await data) return SlackResponse.toEmojis(from: decoded) } catch { print(error.localizedDescription) @@ -69,12 +75,14 @@ class EmojiHoarder: ObservableObject { } func refreshDB(withCallback callback: (() -> Void)? = nil) { - Task { - guard let fetched = try? await fetchRemoteDB() else { return } - withAnimation { self.emojis = fetched } - withAnimation { self.filteredEmojis = fetched } - if let callback { - callback() + Task.detached { + guard let fetched = await self.fetchRemoteDB() else { return } + DispatchQueue.main.async { + withAnimation { self.emojis = fetched } + withAnimation { self.filteredEmojis = fetched } + if let callback { + callback() + } } } } @@ -84,8 +92,8 @@ class EmojiHoarder: ObservableObject { withAnimation(.interactiveSpring) { self.filteredEmojis = emojis } return } - Task { - let filtered = emojis.filter { $0.name.localizedCaseInsensitiveContains(searchTerm) } + Task.detached { + let filtered = await self.emojis.filter { $0.name.localizedCaseInsensitiveContains(searchTerm) } DispatchQueue.main.async { withAnimation(.interactiveSpring) { self.filteredEmojis = filtered } } @@ -97,15 +105,15 @@ class EmojiHoarder: ObservableObject { filterEmojis(by: searchTerm) return } - Task { - filterEmojis(by: searchTerm) + self.filterEmojis(by: searchTerm) + DispatchQueue.main.async { switch category { case .none: fallthrough case .downloaded: - withAnimation(.interactiveSpring) { filteredEmojis = filteredEmojis.filter { $0.isLocal } } + withAnimation(.interactiveSpring) { self.filteredEmojis = self.filteredEmojis.filter { $0.isLocal } } case .notDownloaded: - withAnimation(.interactiveSpring) { filteredEmojis = filteredEmojis.filter { !$0.isLocal } } + withAnimation(.interactiveSpring) { self.filteredEmojis = self.filteredEmojis.filter { !$0.isLocal } } } } } diff --git a/StickerSlack/Views/EmojiPreview.swift b/StickerSlack/Views/EmojiPreview.swift index 20827e0..e877737 100644 --- a/StickerSlack/Views/EmojiPreview.swift +++ b/StickerSlack/Views/EmojiPreview.swift @@ -17,9 +17,8 @@ struct EmojiPreview: View { VStack(alignment: .leading) { Text(emoji.name) Group { - if let localImage = try? Data(contentsOf: emoji.localImageURL), - let image = UIImage(data: localImage) { - Image(uiImage: image) + if emoji.isLocal { + Image(uiImage: emoji.image!) .resizable().scaledToFit() .border(.orange) .overlay(alignment: .bottomLeading) { diff --git a/StickerSlackTests/StickerSlackTests.swift b/StickerSlackTests/StickerSlackTests.swift index 525b438..98f18d4 100644 --- a/StickerSlackTests/StickerSlackTests.swift +++ b/StickerSlackTests/StickerSlackTests.swift @@ -23,4 +23,13 @@ struct StickerSlackTests { } } + @Test func filteringEmojis() async throws { + let searchQueries = ["heavysob", "yay", "afsdjk", "afhjskf", "g4", "aqua-osx", "neotunes", "", "", ""] + for query in searchQueries { + print(query) + hoarder.filteredEmojis = [] + hoarder.filterEmojis(by: query) + print(hoarder.filteredEmojis.count) + } + } } diff --git a/StickerSlackiMessageExtension/Base.lproj/MainInterface.storyboard b/StickerSlackiMessageExtension/Base.lproj/MainInterface.storyboard index f2cbcc0..22a1a2b 100644 --- a/StickerSlackiMessageExtension/Base.lproj/MainInterface.storyboard +++ b/StickerSlackiMessageExtension/Base.lproj/MainInterface.storyboard @@ -15,19 +15,8 @@ - - - - - - - diff --git a/StickerSlackiMessageExtension/MessagesViewController.swift b/StickerSlackiMessageExtension/MessagesViewController.swift index 998fa46..2cac48c 100644 --- a/StickerSlackiMessageExtension/MessagesViewController.swift +++ b/StickerSlackiMessageExtension/MessagesViewController.swift @@ -20,13 +20,6 @@ class MessagesViewController: MSMessagesAppViewController { // MARK: - Conversation Handling override func willBecomeActive(with conversation: MSConversation) { - let l = UILabel() - l.frame = CGRect(x: 20, y: 20, width: 200, height: 40) - l.textColor = .systemOrange - l.text = "hii!" - view.addSubview(l) - view.bringSubviewToFront(l) - let stickerBrowser = MSStickerBrowserView(frame: .zero, stickerSize: .regular) stickerBrowser.frame = CGRect(x: 60, y: 20, width: 200, height: 600) stickerBrowser.dataSource = dataSource