Die Startseite holte ihre Reihen im Gänsemarsch
Die Weboberfläche holt alles, was auf der Startseite steht, in einem
einzigen `Promise.all` — und sie holt sogar mehr davon: Vorschlag und
saisonale Reihe kennt die App gar nicht. Trotzdem war sie spürbar
langsamer. Der Grund stand in einer Schleife:
for mediathek in mediatheken {
... await client.send(...)
}
Ein `await` im Schleifenrumpf heisst: Rundreise, warten, nächste
Rundreise. Bei vier Mediatheken viermal hintereinander, nachdem
„Fortsetzen" und „Als Nächstes" längst da waren. Dieselbe Schleife stand
in beiden Hintergründen, für Flaro wie für Jellyfin.
Jetzt laufen sie nebeneinander, in einer `TaskGroup`. Die Reihenfolge der
Mediatheken bleibt erhalten — nach den Antworten zu ordnen hiesse, dass
die Reihen nach jedem Start woanders stünden. Ein Actor steht dem nicht
im Weg: jede Anfrage gibt ihn beim Warten frei, genau wie die beiden
`async let` darüber es schon tun.
Nebenbei: ein Fehler bei einer Mediathek nimmt die anderen nicht mehr
mit. Eine Startseite mit drei von vier Reihen ist besser als keine.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
8397e042b8
commit
c5ab200846
@@ -130,19 +130,34 @@ public func isInLocalNetwork() async -> Bool {
|
||||
// sind zwei verschiedene Fragen — in einer gemeinsamen Reihe steht am
|
||||
// Ende beides durcheinander, und wer nach einem Film sucht, blättert
|
||||
// an Folgen vorbei.
|
||||
for library in libraries {
|
||||
let items = try? await latestItems(limit: 20, inLibrary: library.id)
|
||||
rows.append(MediaRowGroup(
|
||||
id: "latest.\(library.id)",
|
||||
title: String(
|
||||
localized: "row.latestIn \(library.title)",
|
||||
bundle: .module
|
||||
),
|
||||
libraryID: library.id,
|
||||
items: items ?? []
|
||||
))
|
||||
//
|
||||
// **Nebeneinander, nicht nacheinander.** Hier stand ein `await` in
|
||||
// der Schleife: bei vier Mediatheken vier Rundreisen hintereinander.
|
||||
// Die Reihenfolge der Mediatheken bleibt trotzdem erhalten — sonst
|
||||
// stünden die Reihen nach jedem Start woanders.
|
||||
let latest = await withTaskGroup(of: (Int, MediaRowGroup).self) { group in
|
||||
for (place, library) in libraries.enumerated() {
|
||||
group.addTask {
|
||||
let items = try? await self.latestItems(limit: 20, inLibrary: library.id)
|
||||
return (place, MediaRowGroup(
|
||||
id: "latest.\(library.id)",
|
||||
title: String(
|
||||
localized: "row.latestIn \(library.title)",
|
||||
bundle: .module
|
||||
),
|
||||
libraryID: library.id,
|
||||
items: items ?? []
|
||||
))
|
||||
}
|
||||
}
|
||||
|
||||
var collected: [(Int, MediaRowGroup)] = []
|
||||
for await result in group { collected.append(result) }
|
||||
return collected.sorted { $0.0 < $1.0 }.map(\.1)
|
||||
}
|
||||
|
||||
rows.append(contentsOf: latest)
|
||||
|
||||
rows.append(MediaRowGroup(
|
||||
id: "favourites",
|
||||
title: String(localized: "row.favourites", bundle: .module),
|
||||
|
||||
Reference in New Issue
Block a user