diff --git a/BBus/BBus/Foreground/Home/Model/HomeModel.swift b/BBus/BBus/Foreground/Home/Model/HomeModel.swift index 911d4bf4..b6d1a02a 100644 --- a/BBus/BBus/Foreground/Home/Model/HomeModel.swift +++ b/BBus/BBus/Foreground/Home/Model/HomeModel.swift @@ -33,6 +33,20 @@ struct HomeFavoriteList { self.changedByTimer = false } + init(favorites: [HomeFavorite]) { + var orderedFavorites = [HomeFavorite]() + favorites.forEach { favorite in + if let index = orderedFavorites.firstIndex(where: { $0.stationId == favorite.stationId }) { + orderedFavorites[index].buses.append(contentsOf: favorite.buses) + } + else { + orderedFavorites.append(favorite) + } + } + self.favorites = orderedFavorites + self.changedByTimer = false + } + func count() -> Int { return self.favorites.count } @@ -61,11 +75,11 @@ struct HomeFavoriteList { } } -struct HomeFavorite: Equatable { +typealias HomeFavoriteInfo = (favoriteItem: FavoriteItemDTO, arriveInfo: HomeArriveInfo?) - typealias HomeBusInfo = (favoriteItem: FavoriteItemDTO, arriveInfo: HomeArriveInfo?) +struct HomeFavorite: Equatable { - subscript(index: Int) -> HomeBusInfo? { + subscript(index: Int) -> HomeFavoriteInfo? { guard 0.. AnyPublisher<[FavoriteItemDTO], Error> - func fetchBusRemainTime(favoriteItem: FavoriteItemDTO) -> AnyPublisher + func fetchBusRemainTime(favoriteItem: FavoriteItemDTO) -> AnyPublisher func fetchStation() -> AnyPublisher<[StationDTO], Error> func fetchBusRoute() -> AnyPublisher<[BusRouteDTO], Error> } @@ -35,7 +35,7 @@ final class HomeAPIUseCase: HomeAPIUsable { .eraseToAnyPublisher() } - func fetchBusRemainTime(favoriteItem: FavoriteItemDTO) -> AnyPublisher { + func fetchBusRemainTime(favoriteItem: FavoriteItemDTO) -> AnyPublisher { return self.useCases.getArrInfoByRouteList(stId: favoriteItem.stId, busRouteId: favoriteItem.busRouteId, ord: favoriteItem.ord) @@ -43,7 +43,10 @@ final class HomeAPIUseCase: HomeAPIUsable { .tryMap({ item in let result = item.msgBody.itemList guard let item = result.first else { throw BBusAPIError.wrongFormatError } - return item + let homeFavoriteInfo: HomeFavoriteInfo + homeFavoriteInfo.favoriteItem = favoriteItem + homeFavoriteInfo.arriveInfo = HomeArriveInfo(arrInfoByRouteDTO: item) + return homeFavoriteInfo }) .eraseToAnyPublisher() } diff --git a/BBus/BBus/Foreground/Home/ViewModel/HomeViewModel.swift b/BBus/BBus/Foreground/Home/ViewModel/HomeViewModel.swift index 22c8b8ff..fc64b42f 100644 --- a/BBus/BBus/Foreground/Home/ViewModel/HomeViewModel.swift +++ b/BBus/BBus/Foreground/Home/ViewModel/HomeViewModel.swift @@ -55,22 +55,28 @@ final class HomeViewModel { .store(in: &self.cancellables) } - func loadRemainTime(with favoriteItems: [FavoriteItemDTO]) { - favoriteItems.forEach { [weak self] favoriteItem in - guard let self = self else { return } - self.apiUseCase.fetchBusRemainTime(favoriteItem: favoriteItem) + private func loadRemainTime(with favoriteItems: [FavoriteItemDTO]) { + guard let homeFavoriteList = homeFavoriteList else { return } + + var newHomeFavoriteList = homeFavoriteList + favoriteItems.publisher + .receive(on: DispatchQueue.global()) + .flatMap({ [weak self] (favoriteItem) -> AnyPublisher in + guard let self = self else { return NetworkError.unknownError.publisher } + return self.apiUseCase.fetchBusRemainTime(favoriteItem: favoriteItem) + }) .catchError({ [weak self] error in self?.networkError = error }) - .map({ arrInfoByRouteDTO in - return HomeArriveInfo(arrInfoByRouteDTO: arrInfoByRouteDTO) - }) - .sink(receiveValue: { [weak self] homeArrivalInfo in - guard let indexPath = self?.homeFavoriteList?.indexPath(of: favoriteItem) else { return } - self?.homeFavoriteList?.configure(homeArrivalinfo: homeArrivalInfo, indexPath: indexPath) + .map({ (homeFavoriteInfo) -> HomeFavoriteList? in + guard let indexPath = newHomeFavoriteList.indexPath(of: homeFavoriteInfo.favoriteItem), + let arriveInfo = homeFavoriteInfo.arriveInfo else { return nil } + newHomeFavoriteList.configure(homeArrivalinfo: arriveInfo, indexPath: indexPath) + return newHomeFavoriteList }) - .store(in: &self.cancellables) - } + .compactMap({ $0 }) + .last() + .assign(to: &self.$homeFavoriteList) } private func loadBusRouteList() { @@ -107,3 +113,12 @@ final class HomeViewModel { return self.calculateUseCase.findBusType(in: self.busRouteList, by: busName) } } + +fileprivate extension Error { + var publisher: AnyPublisher { + let publisher = CurrentValueSubject(nil) + publisher.send(completion: .failure(self)) + return publisher.compactMap({$0}) + .eraseToAnyPublisher() + } +}