diff --git a/Nos/Models/RelaySubscription.swift b/Nos/Models/RelaySubscription.swift index 11e00acc2..2260e3137 100644 --- a/Nos/Models/RelaySubscription.swift +++ b/Nos/Models/RelaySubscription.swift @@ -2,7 +2,7 @@ import Foundation import Logger /// Models a request to a relay for Nostr Events. -struct RelaySubscription: Identifiable { +struct RelaySubscription: Identifiable, Hashable { var id: String diff --git a/Nos/Service/Relay/PagedRelaySubscription.swift b/Nos/Service/Relay/PagedRelaySubscription.swift index abc60bb48..9f44cb34b 100644 --- a/Nos/Service/Relay/PagedRelaySubscription.swift +++ b/Nos/Service/Relay/PagedRelaySubscription.swift @@ -12,10 +12,10 @@ class PagedRelaySubscription { private var subscriptionManager: RelaySubscriptionManager /// A set of subscriptions fetching older events. - private var pagedSubscriptionIDs = [RelaySubscription.ID]() + private var pagedSubscriptionIDs = Set() /// A set of subscriptions always listening for new events published after the `startDate`. - private var newEventsSubscriptionIDs = [RelaySubscription.ID]() + private var newEventsSubscriptionIDs = Set() init( startDate: Date, @@ -36,10 +36,10 @@ class PagedRelaySubscription { var newEventsFilter = filter newEventsFilter.since = startDate for relayAddress in relayAddresses { - newEventsSubscriptionIDs.append( + newEventsSubscriptionIDs.insert( await subscriptionManager.queueSubscription(with: filter, to: relayAddress) ) - pagedSubscriptionIDs.append( + pagedSubscriptionIDs.insert( await subscriptionManager.queueSubscription(with: pagedEventsFilter, to: relayAddress) ) } @@ -61,6 +61,7 @@ class PagedRelaySubscription { func loadMore() { Task { [self] in var newUntilDates = [URL: Date]() + var subscriptionsToRemove = Set() for subscriptionID in pagedSubscriptionIDs { if let subscription = await subscriptionManager.subscription(from: subscriptionID), @@ -73,13 +74,16 @@ class PagedRelaySubscription { newUntilDates[subscription.relayAddress] = newDate await subscriptionManager.decrementSubscriptionCount(for: subscriptionID) + subscriptionsToRemove.insert(subscription.id) } } + pagedSubscriptionIDs.subtract(subscriptionsToRemove) + for (relayAddress, until) in newUntilDates { var newEventsFilter = self.filter newEventsFilter.until = until - pagedSubscriptionIDs.append( + pagedSubscriptionIDs.insert( await subscriptionManager.queueSubscription(with: newEventsFilter, to: relayAddress) ) }