Use request cancellation and IsDisposed guard instead of more Schedule

This commit is contained in:
Dean Herbert
2022-09-26 16:02:33 +09:00
parent 0fa5e1b28e
commit 32d56fe3a9
2 changed files with 19 additions and 11 deletions

View File

@ -89,6 +89,8 @@ namespace osu.Game.Screens.Select.Leaderboards
private IDisposable scoreSubscription;
private GetScoresRequest scoreRetrievalRequest;
[BackgroundDependencyLoader]
private void load()
{
@ -151,15 +153,14 @@ namespace osu.Game.Screens.Select.Leaderboards
else if (filterMods)
requestMods = mods.Value;
var req = new GetScoresRequest(fetchBeatmapInfo, fetchRuleset, Scope, requestMods);
scoreRetrievalRequest = new GetScoresRequest(fetchBeatmapInfo, fetchRuleset, Scope, requestMods);
// Schedule is required to avoid potential object disposed exception when LoadComponentAsync is eventually called.
req.Success += r => Schedule(() => SetScores(
scoreManager.OrderByTotalScore(r.Scores.Select(s => s.ToScoreInfo(rulesets, fetchBeatmapInfo))),
r.UserScore?.CreateScoreInfo(rulesets, fetchBeatmapInfo)
));
scoreRetrievalRequest.Success += response => SetScores(
scoreManager.OrderByTotalScore(response.Scores.Select(s => s.ToScoreInfo(rulesets, fetchBeatmapInfo))),
response.UserScore?.CreateScoreInfo(rulesets, fetchBeatmapInfo)
);
return req;
return scoreRetrievalRequest;
}
protected override LeaderboardScore CreateDrawableScore(ScoreInfo model, int index) => new LeaderboardScore(model, index, IsOnlineScope)
@ -219,7 +220,9 @@ namespace osu.Game.Screens.Select.Leaderboards
protected override void Dispose(bool isDisposing)
{
base.Dispose(isDisposing);
scoreSubscription?.Dispose();
scoreRetrievalRequest?.Cancel();
}
}
}