From c12199e4aae026e3e36b59eaa41deb4ff08c700e Mon Sep 17 00:00:00 2001 From: HystericalDragon <138737572+HystericalDragon@users.noreply.github.com> Date: Fri, 25 Aug 2023 08:27:53 +0800 Subject: [PATCH] fix: update too much times when update all groups --- sub/GroupUpdater.cpp | 52 ++++++++++++++++++++------------------------ 1 file changed, 23 insertions(+), 29 deletions(-) diff --git a/sub/GroupUpdater.cpp b/sub/GroupUpdater.cpp index 5de4047..1c6edcc 100644 --- a/sub/GroupUpdater.cpp +++ b/sub/GroupUpdater.cpp @@ -651,32 +651,32 @@ bool UI_update_all_groups_Updating = false; #define should_skip_group(g) (g == nullptr || g->url.isEmpty() || g->archive || (onlyAllowed && g->skip_auto_update)) void serialUpdateSubscription(const QList &groupsTabOrder, int _order, bool onlyAllowed) { - // calculate next group - int nextOrder = _order; - std::shared_ptr nextGroup; - forever { - nextOrder += 1; - if (nextOrder >= groupsTabOrder.size()) break; - auto nextGid = groupsTabOrder[nextOrder]; - nextGroup = NekoGui::profileManager->GetGroup(nextGid); - if (should_skip_group(nextGroup)) continue; - break; - } - - // calculate this group - auto group = NekoGui::profileManager->GetGroup(groupsTabOrder[_order]); - if (group == nullptr) { + if (_order >= groupsTabOrder.size()) { UI_update_all_groups_Updating = false; return; } - // v2.2: listener is moved to GroupItem, no refresh here. - NekoGui_sub::groupUpdater->AsyncUpdate(group->url, group->id, [=] { - if (nextGroup == nullptr) { - UI_update_all_groups_Updating = false; - } else { - serialUpdateSubscription(groupsTabOrder, nextOrder, onlyAllowed); + // calculate this group + auto group = NekoGui::profileManager->GetGroup(groupsTabOrder[_order]); + if (group == nullptr || should_skip_group(group)) { + serialUpdateSubscription(groupsTabOrder, _order + 1, onlyAllowed); + return; + } + + int nextOrder = _order + 1; + while (nextOrder < groupsTabOrder.size()) { + auto nextGid = groupsTabOrder[nextOrder]; + auto nextGroup = NekoGui::profileManager->GetGroup(nextGid); + if (!should_skip_group(nextGroup)) { + break; } + nextOrder += 1; + } + + // Async update current group + UI_update_all_groups_Updating = true; + NekoGui_sub::groupUpdater->AsyncUpdate(group->url, group->id, [=] { + serialUpdateSubscription(groupsTabOrder, nextOrder, onlyAllowed); }); } @@ -685,13 +685,7 @@ void UI_update_all_groups(bool onlyAllowed) { MW_show_log("The last subscription update has not exited."); return; } - // first: freeze group order + auto groupsTabOrder = NekoGui::profileManager->groupsTabOrder; - for (const auto &gid: groupsTabOrder) { - auto group = NekoGui::profileManager->GetGroup(gid); - if (should_skip_group(group)) continue; - // start - UI_update_all_groups_Updating = true; - serialUpdateSubscription(groupsTabOrder, groupsTabOrder.indexOf(gid), onlyAllowed); - } + serialUpdateSubscription(groupsTabOrder, 0, onlyAllowed); }