From a19be83f992869960797717ad408d4c0a8de8a6b Mon Sep 17 00:00:00 2001 From: Jobobby04 Date: Tue, 7 Feb 2023 14:03:27 -0500 Subject: [PATCH] Parallelize feed properly --- .../ui/browse/feed/FeedScreenModel.kt | 64 ++++++++++--------- .../source/feed/SourceFeedScreenModel.kt | 56 ++++++++-------- 2 files changed, 64 insertions(+), 56 deletions(-) diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/feed/FeedScreenModel.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/feed/FeedScreenModel.kt index 05998508b..46df0a614 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/feed/FeedScreenModel.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/feed/FeedScreenModel.kt @@ -32,6 +32,8 @@ import eu.kanade.tachiyomi.util.system.logcat import exh.savedsearches.models.FeedSavedSearch import exh.savedsearches.models.SavedSearch import kotlinx.coroutines.asCoroutineDispatcher +import kotlinx.coroutines.async +import kotlinx.coroutines.awaitAll import kotlinx.coroutines.channels.Channel import kotlinx.coroutines.flow.catch import kotlinx.coroutines.flow.collectLatest @@ -227,41 +229,43 @@ open class FeedScreenModel( */ private fun getFeed(feedSavedSearch: List) { coroutineScope.launch { - feedSavedSearch.forEach { itemUI -> - val page = try { - if (itemUI.source != null) { - withContext(coroutineDispatcher) { - if (itemUI.savedSearch == null) { - itemUI.source.fetchLatestUpdates(1) - } else { - itemUI.source.fetchSearchManga( - 1, - itemUI.savedSearch.query.orEmpty(), - getFilterList(itemUI.savedSearch, itemUI.source), - ) - }.awaitSingle() - }.mangas - } else { + feedSavedSearch.map { itemUI -> + async { + val page = try { + if (itemUI.source != null) { + withContext(coroutineDispatcher) { + if (itemUI.savedSearch == null) { + itemUI.source.fetchLatestUpdates(1) + } else { + itemUI.source.fetchSearchManga( + 1, + itemUI.savedSearch.query.orEmpty(), + getFilterList(itemUI.savedSearch, itemUI.source), + ) + }.awaitSingle() + }.mangas + } else { + emptyList() + } + } catch (e: Exception) { emptyList() } - } catch (e: Exception) { - emptyList() - } - val result = itemUI.copy( - results = page.map { - withIOContext { - networkToLocalManga.await(it.toDomainManga(itemUI.source!!.id)) - } - }, - ) + val result = withIOContext { + itemUI.copy( + results = page.map { + networkToLocalManga.await(it.toDomainManga(itemUI.source!!.id)) + }, + ) + } - mutableState.update { state -> - state.copy( - items = state.items?.map { if (it.feed.id == result.feed.id) result else it }, - ) + mutableState.update { state -> + state.copy( + items = state.items?.map { if (it.feed.id == result.feed.id) result else it }, + ) + } } - } + }.awaitAll() } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/feed/SourceFeedScreenModel.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/feed/SourceFeedScreenModel.kt index 4d6ad41b9..50efa981f 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/feed/SourceFeedScreenModel.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/feed/SourceFeedScreenModel.kt @@ -31,6 +31,8 @@ import eu.kanade.tachiyomi.util.system.logcat import exh.savedsearches.models.FeedSavedSearch import exh.savedsearches.models.SavedSearch import kotlinx.coroutines.asCoroutineDispatcher +import kotlinx.coroutines.async +import kotlinx.coroutines.awaitAll import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach @@ -127,35 +129,37 @@ open class SourceFeedScreenModel( */ private fun getFeed(feedSavedSearch: List) { coroutineScope.launch { - feedSavedSearch.forEach { sourceFeed -> - val page = try { - withContext(coroutineDispatcher) { - when (sourceFeed) { - is SourceFeedUI.Browse -> source.fetchPopularManga(1) - is SourceFeedUI.Latest -> source.fetchLatestUpdates(1) - is SourceFeedUI.SourceSavedSearch -> source.fetchSearchManga( - page = 1, - query = sourceFeed.savedSearch.query.orEmpty(), - filters = getFilterList(sourceFeed.savedSearch, source), - ) - }.awaitSingle() - }.mangas - } catch (e: Exception) { - emptyList() - } + feedSavedSearch.map { sourceFeed -> + async { + val page = try { + withContext(coroutineDispatcher) { + when (sourceFeed) { + is SourceFeedUI.Browse -> source.fetchPopularManga(1) + is SourceFeedUI.Latest -> source.fetchLatestUpdates(1) + is SourceFeedUI.SourceSavedSearch -> source.fetchSearchManga( + page = 1, + query = sourceFeed.savedSearch.query.orEmpty(), + filters = getFilterList(sourceFeed.savedSearch, source), + ) + }.awaitSingle() + }.mangas + } catch (e: Exception) { + emptyList() + } - val titles = page.map { - withIOContext { - networkToLocalManga.await(it.toDomainManga(source.id)) + val titles = withIOContext { + page.map { + networkToLocalManga.await(it.toDomainManga(source.id)) + } + } + + mutableState.update { state -> + state.copy( + items = state.items.map { item -> if (item.id == sourceFeed.id) sourceFeed.withResults(titles) else item }, + ) } } - - mutableState.update { state -> - state.copy( - items = state.items.map { item -> if (item.id == sourceFeed.id) sourceFeed.withResults(titles) else item }, - ) - } - } + }.awaitAll() } }