mirror of
https://github.com/yattee/yattee.git
synced 2025-08-09 20:24:06 +00:00
Snappy UI - Offloading non UI task to background threads
This gives a huge increase in perceived performance. The UI is now much more responsive since some tasks are run in the background and don't block the UI anymore.
This commit is contained in:
@@ -89,6 +89,9 @@ struct FavoriteItemView: View {
|
||||
loadCacheAndResource()
|
||||
}
|
||||
}
|
||||
.onDisappear {
|
||||
resource?.removeObservers(ownedBy: store)
|
||||
}
|
||||
.onChange(of: player.currentVideo) { _ in reloadVisibleWatches() }
|
||||
.onChange(of: hideShorts) { _ in reloadVisibleWatches() }
|
||||
.onChange(of: hideWatched) { _ in reloadVisibleWatches() }
|
||||
@@ -96,13 +99,12 @@ struct FavoriteItemView: View {
|
||||
}
|
||||
.id(watchModel.historyToken)
|
||||
.onChange(of: accounts.current) { _ in
|
||||
resource?.removeObservers(ownedBy: store)
|
||||
resource?.addObserver(store)
|
||||
loadCacheAndResource(force: true)
|
||||
}
|
||||
.onChange(of: watchModel.historyToken) { _ in
|
||||
Delay.by(0.5) {
|
||||
reloadVisibleWatches()
|
||||
}
|
||||
reloadVisibleWatches()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -164,12 +166,15 @@ struct FavoriteItemView: View {
|
||||
.prefix(favoritesModel.limit(item))
|
||||
)
|
||||
let last = watches.last
|
||||
|
||||
for watch in watches {
|
||||
player.loadHistoryVideoDetails(watch) {
|
||||
guard let video = player.historyVideo(watch.videoID), itemVisible(.init(video: video)) else { return }
|
||||
visibleWatches.append(watch)
|
||||
guard watch == last else { return }
|
||||
visibleWatches.sort { $0.watchedAt ?? Date() > $1.watchedAt ?? Date() }
|
||||
|
||||
if watch == last {
|
||||
visibleWatches.sort { $0.watchedAt ?? Date() > $1.watchedAt ?? Date() }
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -5,18 +5,52 @@ final class FavoriteResourceObserver: ObservableObject, ResourceObserver {
|
||||
@Published var contentItems = [ContentItem]()
|
||||
|
||||
func resourceChanged(_ resource: Resource, event _: ResourceEvent) {
|
||||
// swiftlint:disable discouraged_optional_collection
|
||||
var newVideos: [Video]?
|
||||
var newItems: [ContentItem]?
|
||||
// swiftlint:enable discouraged_optional_collection
|
||||
|
||||
var newChannel: Channel?
|
||||
var newChannelPlaylist: ChannelPlaylist?
|
||||
var newPlaylist: Playlist?
|
||||
var newPage: SearchPage?
|
||||
|
||||
if let videos: [Video] = resource.typedContent() {
|
||||
contentItems = videos.map { ContentItem(video: $0) }
|
||||
newVideos = videos
|
||||
} else if let channel: Channel = resource.typedContent() {
|
||||
contentItems = channel.videos.map { ContentItem(video: $0) }
|
||||
newChannel = channel
|
||||
} else if let playlist: ChannelPlaylist = resource.typedContent() {
|
||||
contentItems = playlist.videos.map { ContentItem(video: $0) }
|
||||
newChannelPlaylist = playlist
|
||||
} else if let playlist: Playlist = resource.typedContent() {
|
||||
contentItems = playlist.videos.map { ContentItem(video: $0) }
|
||||
newPlaylist = playlist
|
||||
} else if let page: SearchPage = resource.typedContent() {
|
||||
contentItems = page.results
|
||||
newPage = page
|
||||
} else if let items: [ContentItem] = resource.typedContent() {
|
||||
contentItems = items
|
||||
newItems = items
|
||||
}
|
||||
|
||||
DispatchQueue.global(qos: .userInitiated).async {
|
||||
var newContentItems: [ContentItem] = []
|
||||
|
||||
if let videos = newVideos {
|
||||
newContentItems = videos.map { ContentItem(video: $0) }
|
||||
} else if let channel = newChannel {
|
||||
newContentItems = channel.videos.map { ContentItem(video: $0) }
|
||||
} else if let playlist = newChannelPlaylist {
|
||||
newContentItems = playlist.videos.map { ContentItem(video: $0) }
|
||||
} else if let playlist = newPlaylist {
|
||||
newContentItems = playlist.videos.map { ContentItem(video: $0) }
|
||||
} else if let page = newPage {
|
||||
newContentItems = page.results
|
||||
} else if let items = newItems {
|
||||
newContentItems = items
|
||||
}
|
||||
|
||||
DispatchQueue.main.async {
|
||||
if !newContentItems.isEmpty {
|
||||
self.contentItems = newContentItems
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user