diff --git a/DailyQuest/DailyQuest/Data/PersistentStorages/BrowseQuestsStorage/BrowseQuestsStorage.swift b/DailyQuest/DailyQuest/Data/PersistentStorages/BrowseQuestsStorage/BrowseQuestsStorage.swift index 200ce08..9ac2a7c 100644 --- a/DailyQuest/DailyQuest/Data/PersistentStorages/BrowseQuestsStorage/BrowseQuestsStorage.swift +++ b/DailyQuest/DailyQuest/Data/PersistentStorages/BrowseQuestsStorage/BrowseQuestsStorage.swift @@ -8,7 +8,7 @@ import RxSwift protocol BrowseQuestsStorage { - func fetchBrowseQuests() -> Observable<[BrowseQuest]> + func fetchBrowseQuests() -> Single<[BrowseQuest]> func saveBrowseQuest(browseQuest: BrowseQuest) -> Single func deleteBrowseQuests() -> Single } diff --git a/DailyQuest/DailyQuest/Data/PersistentStorages/BrowseQuestsStorage/RealmStorage/RealmBrowseQuestsStorage.swift b/DailyQuest/DailyQuest/Data/PersistentStorages/BrowseQuestsStorage/RealmStorage/RealmBrowseQuestsStorage.swift index be722a2..e5b8e51 100644 --- a/DailyQuest/DailyQuest/Data/PersistentStorages/BrowseQuestsStorage/RealmStorage/RealmBrowseQuestsStorage.swift +++ b/DailyQuest/DailyQuest/Data/PersistentStorages/BrowseQuestsStorage/RealmStorage/RealmBrowseQuestsStorage.swift @@ -17,8 +17,8 @@ final class RealmBrowseQuestsStorage { } extension RealmBrowseQuestsStorage: BrowseQuestsStorage { - func fetchBrowseQuests() -> Observable<[BrowseQuest]> { - return Observable<[BrowseQuest]>.create { [weak self] observer in + func fetchBrowseQuests() -> Single<[BrowseQuest]> { + return Single<[BrowseQuest]>.create { [weak self] single in guard let realmStorage = self?.realmStorage else { return Disposables.create() } @@ -26,10 +26,9 @@ extension RealmBrowseQuestsStorage: BrowseQuestsStorage { do { let browseQuests = try realmStorage.fetchEntities(type: BrowseQuestEntity.self) .compactMap { $0.toDomain() } - observer.onNext(browseQuests) - observer.onCompleted() + single(.success(browseQuests)) } catch let error { - observer.onError(error) + single(.failure(error)) } return Disposables.create() diff --git a/DailyQuest/DailyQuest/Data/PersistentStorages/UserInfoStorage/RealmStorage/RealmUserInfoStorage.swift b/DailyQuest/DailyQuest/Data/PersistentStorages/UserInfoStorage/RealmStorage/RealmUserInfoStorage.swift index 6150932..090fab5 100644 --- a/DailyQuest/DailyQuest/Data/PersistentStorages/UserInfoStorage/RealmStorage/RealmUserInfoStorage.swift +++ b/DailyQuest/DailyQuest/Data/PersistentStorages/UserInfoStorage/RealmStorage/RealmUserInfoStorage.swift @@ -17,40 +17,27 @@ final class RealmUserInfoStorage { } extension RealmUserInfoStorage: UserInfoStorage { - func fetchUserInfo() -> Observable { - return Observable.create { [weak self] observer in - guard let realmStorage = self?.realmStorage else { - // self가 존재하지 않을 경우, 반환하지 않고 종료 - return Disposables.create() - } - + func fetchUserInfo() -> Single { + return Single.create { [weak self] single in do { + guard let realmStorage = self?.realmStorage else { throw RealmStorageError.realmObjectError } guard let userInfoEntity = try realmStorage.fetchEntities(type: UserInfoEntity.self) .first else { throw RealmStorageError.noDataError } - - observer.onNext(userInfoEntity.toDomain()) - observer.onCompleted() + single(.success(userInfoEntity.toDomain())) } catch let error { - // Realm을 불러올 수 없을 경우, realmObjectError - // User 정보가 없을 경우, noDataError - observer.onError(error) + single(.failure(error)) } - return Disposables.create() } } func updateUserInfo(user: User) -> Single { return Single.create { [weak self] single in - guard let realmStorage = self?.realmStorage else { - return Disposables.create() - } - let userInfo = UserInfoEntity(user: user) - do { + guard let realmStorage = self?.realmStorage else { throw RealmStorageError.realmObjectError } // update 성공했을 경우, success(user) try realmStorage.updateEntity(entity: userInfo) single(.success(user)) @@ -65,12 +52,8 @@ extension RealmUserInfoStorage: UserInfoStorage { func deleteUserInfo() -> Single { return Single.create { [weak self] single in - guard let realmStorage = self?.realmStorage else { - return Disposables.create() - } - do { - // update 성공했을 경우, success(user) + guard let realmStorage = self?.realmStorage else { throw RealmStorageError.realmObjectError } guard let user = try realmStorage.deleteAllEntity(type: UserInfoEntity.self).first?.toDomain() else { throw RealmStorageError.noDataError } @@ -79,7 +62,6 @@ extension RealmUserInfoStorage: UserInfoStorage { // update 성공하지 못했을 경우, failure(error) single(.failure(RealmStorageError.deleteError(error))) } - return Disposables.create() } } diff --git a/DailyQuest/DailyQuest/Data/PersistentStorages/UserInfoStorage/UserInfoStorage.swift b/DailyQuest/DailyQuest/Data/PersistentStorages/UserInfoStorage/UserInfoStorage.swift index 3b67cc1..4ec6586 100644 --- a/DailyQuest/DailyQuest/Data/PersistentStorages/UserInfoStorage/UserInfoStorage.swift +++ b/DailyQuest/DailyQuest/Data/PersistentStorages/UserInfoStorage/UserInfoStorage.swift @@ -8,7 +8,7 @@ import RxSwift protocol UserInfoStorage { - func fetchUserInfo() -> Observable + func fetchUserInfo() -> Single func updateUserInfo(user: User) -> Single func deleteUserInfo() -> Single } diff --git a/DailyQuest/DailyQuest/Data/Repositories/DefaultBrowseRepository.swift b/DailyQuest/DailyQuest/Data/Repositories/DefaultBrowseRepository.swift index 07c1a18..6bed6e4 100644 --- a/DailyQuest/DailyQuest/Data/Repositories/DefaultBrowseRepository.swift +++ b/DailyQuest/DailyQuest/Data/Repositories/DefaultBrowseRepository.swift @@ -26,14 +26,14 @@ extension DefaultBrowseRepository: BrowseRepository { /// Fetch BrowseQuests /// Firebase 우선, 실패시 persistentStorage, persistentStorage도 실패시 Error반환 /// - Returns: Observable<[BrowseQuest]> - func fetch() -> Observable<[BrowseQuest]> { - return self.networkService.getAllowUsers(limit: 10) + func fetch() -> Single<[BrowseQuest]> { + let uid = networkService.uid.value + return networkService.getAllowUsers(limit: 10) .map { $0.toDomain() } .flatMap(fetchBrowseQuestNetworkService(user:)) - .filter { !$0.quests.isEmpty } + .filter { !$0.quests.isEmpty && uid != $0.user.uuid } .toArray() - .asObservable() - .do(afterNext: { [weak self] browseQuests in + .do(afterSuccess: { [weak self] browseQuests in guard let self = self else { return } self.persistentStorage.deleteBrowseQuests() .asObservable() @@ -45,20 +45,20 @@ extension DefaultBrowseRepository: BrowseRepository { .disposed(by: self.disposeBag) }) .timeout(.seconds(5), scheduler: MainScheduler.instance) - .catch { _ in - return self.persistentStorage.fetchBrowseQuests() + .catch { [weak self] _ in + guard let self = self else { return Single.just([])} + return self.persistentStorage.fetchBrowseQuests() } } } private extension DefaultBrowseRepository { - func fetchBrowseQuestNetworkService(user: User) -> Observable { + func fetchBrowseQuestNetworkService(user: User) -> Single { networkService .read(type: QuestDTO.self, userCase: .anotherUser(user.uuid), access: .quests, filter: .today(Date())) .map { $0.toDomain() } .toArray() - .asObservable() - .map { return BrowseQuest(user: user, quests: $0) } + .map { BrowseQuest(user: user, quests: $0) } } func saveBrowseQuestPersistentStorage(browseQuest: BrowseQuest) -> Observable { diff --git a/DailyQuest/DailyQuest/Data/Repositories/DefaultQuestsRepository.swift b/DailyQuest/DailyQuest/Data/Repositories/DefaultQuestsRepository.swift index 73df3ba..fb18ece 100644 --- a/DailyQuest/DailyQuest/Data/Repositories/DefaultQuestsRepository.swift +++ b/DailyQuest/DailyQuest/Data/Repositories/DefaultQuestsRepository.swift @@ -24,11 +24,10 @@ extension DefaultQuestsRepository: QuestsRepository { .flatMap (saveNetworkService(quests:)) } - func fetch(by date: Date) -> Observable<[Quest]> { + func fetch(by date: Date) -> Single<[Quest]> { return persistentStorage.fetchQuests(by: date) - .asObservable() .catch { [weak self] _ in - guard let self = self else { return Observable.just([]) } + guard let self = self else { return Single.just([]) } return self.fetchNetworkService(date: date) } .catchAndReturn([]) @@ -49,14 +48,13 @@ extension DefaultQuestsRepository: QuestsRepository { .flatMap(deleteAllNetworkService(quests:)) } - func fetch(by uuid: String, date: Date) -> Observable<[Quest]> { + func fetch(by uuid: String, date: Date) -> Single<[Quest]> { return networkService.read(type: QuestDTO.self, userCase: .anotherUser(uuid), access: .quests, filter: .today(date)) .map { $0.toDomain() } .toArray() - .asObservable() } } @@ -74,11 +72,10 @@ private extension DefaultQuestsRepository { .toArray() } - func fetchNetworkService(date: Date) -> Observable<[Quest]> { + func fetchNetworkService(date: Date) -> Single<[Quest]> { return networkService.read(type: QuestDTO.self, userCase: .currentUser, access: .quests, filter: .today(date)) .map { $0.toDomain() } .toArray() - .asObservable() .catchAndReturn([]) } diff --git a/DailyQuest/DailyQuest/Data/Repositories/DefaultUserRepository.swift b/DailyQuest/DailyQuest/Data/Repositories/DefaultUserRepository.swift index 2114a69..64582a9 100644 --- a/DailyQuest/DailyQuest/Data/Repositories/DefaultUserRepository.swift +++ b/DailyQuest/DailyQuest/Data/Repositories/DefaultUserRepository.swift @@ -30,17 +30,14 @@ extension DefaultUserRepository: UserRepository { func readUser() -> Single { return self.persistentStorage.fetchUserInfo() .catch { [weak self] _ in - guard let self = self else { return Observable.just(User()) } + guard let self = self else { return Single.just(User()) } return self.fetchUserNetworkService() } - .asSingle() } func updateUser(by user: User) -> Single { return persistentStorage.updateUserInfo(user: user) - .asObservable() .flatMap(updateUserNetworkService(user:)) - .asSingle() } func fetchUser(by uuid: String) -> Single { @@ -67,13 +64,12 @@ extension DefaultUserRepository: UserRepository { return self.networkService.update(userCase: .currentUser, access: .userInfo, dto: userDto) } .map { $0.toDomain() } - .asSingle() } .flatMap(updateUser(by:)) .map { _ in true } .catchAndReturn(false) - .do(afterSuccess: { _ in - NotificationCenter.default.post(name: .userUpdated, object: nil) + .do(afterSuccess: { result in + NotificationCenter.default.post(name: .userUpdated, object: result) }) } @@ -92,7 +88,6 @@ extension DefaultUserRepository: UserRepository { return self.networkService.update(userCase: .currentUser, access: .userInfo, dto: userDto) } .map { $0.toDomain() } - .asSingle() } .flatMap(updateUser(by:)) .map { _ in true } @@ -105,11 +100,11 @@ extension DefaultUserRepository: UserRepository { } extension DefaultUserRepository: ProtectedUserRepository { - func deleteUser() -> Observable { + func deleteUser() -> Single { return networkService .delete(userCase: .currentUser, access: .userInfo, dto: UserDTO()) .flatMap { [weak self] _ in - guard let self = self else { return .just(true) } + guard let self = self else { return .just(false) } return self.networkService.deleteUser() .flatMap { _ in return self.persistentStorage.deleteUserInfo() @@ -117,8 +112,7 @@ extension DefaultUserRepository: ProtectedUserRepository { } } .catchAndReturn(false) - .asObservable() - .do(onNext: { [weak self]_ in + .do(onSuccess: { [weak self]_ in guard let self = self else { return } self.networkService.signOut().subscribe() .disposed(by: self.disposeBag) @@ -127,15 +121,15 @@ extension DefaultUserRepository: ProtectedUserRepository { } private extension DefaultUserRepository { - func fetchUserNetworkService() -> Observable { + func fetchUserNetworkService() -> Single { networkService.read(type: UserDTO.self, userCase: .currentUser, access: .userInfo, filter: nil) .map { $0.toDomain() } + .asSingle() } - func updateUserNetworkService(user: User) -> Observable { + func updateUserNetworkService(user: User) -> Single { networkService.update(userCase: .currentUser, access: .userInfo, dto: user.toDTO()) .map { $0.toDomain() } - .asObservable() .catchAndReturn(user) } } diff --git a/DailyQuest/DailyQuest/Domain/Interfaces/Repositories/BrowseRepository.swift b/DailyQuest/DailyQuest/Domain/Interfaces/Repositories/BrowseRepository.swift index 1ae7940..bf1ccef 100644 --- a/DailyQuest/DailyQuest/Domain/Interfaces/Repositories/BrowseRepository.swift +++ b/DailyQuest/DailyQuest/Domain/Interfaces/Repositories/BrowseRepository.swift @@ -9,5 +9,5 @@ import RxSwift protocol BrowseRepository { // TODO: 무한 스크롤을 위한 페이징 추가 - func fetch() -> Observable<[BrowseQuest]> + func fetch() -> Single<[BrowseQuest]> } diff --git a/DailyQuest/DailyQuest/Domain/Interfaces/Repositories/ProtectedUserRepository.swift b/DailyQuest/DailyQuest/Domain/Interfaces/Repositories/ProtectedUserRepository.swift index cf438e2..9cc02f5 100644 --- a/DailyQuest/DailyQuest/Domain/Interfaces/Repositories/ProtectedUserRepository.swift +++ b/DailyQuest/DailyQuest/Domain/Interfaces/Repositories/ProtectedUserRepository.swift @@ -10,5 +10,5 @@ import RxSwift protocol ProtectedUserRepository { /// 유저정보를 삭제합니다. /// - Returns: 삭제 성공 여부를 방출하는 Observable입니다. - func deleteUser() -> Observable + func deleteUser() -> Single } diff --git a/DailyQuest/DailyQuest/Domain/Interfaces/Repositories/QuestsRepository.swift b/DailyQuest/DailyQuest/Domain/Interfaces/Repositories/QuestsRepository.swift index b8a82db..5031d10 100644 --- a/DailyQuest/DailyQuest/Domain/Interfaces/Repositories/QuestsRepository.swift +++ b/DailyQuest/DailyQuest/Domain/Interfaces/Repositories/QuestsRepository.swift @@ -26,7 +26,7 @@ protocol QuestsRepository { - date: 받아오길 원하는 날짜입니다. - Returns: Quest의 배열을 방출하는 Observable입니다. 비어있다면 비어있는 배열을 방출합니다. */ - func fetch(by date: Date) -> Observable<[Quest]> + func fetch(by date: Date) -> Single<[Quest]> /** 해당 날짜의 퀘스트 값(`currentCount`)을 업데이트 합니다. @@ -56,5 +56,5 @@ protocol QuestsRepository { */ func deleteAll(with groupId: UUID) -> Single<[Quest]> - func fetch(by uuid: String, date: Date) -> Observable<[Quest]> + func fetch(by uuid: String, date: Date) -> Single<[Quest]> } diff --git a/DailyQuest/DailyQuest/Domain/UseCases/Browse/DefaultBrowseUseCase.swift b/DailyQuest/DailyQuest/Domain/UseCases/Browse/DefaultBrowseUseCase.swift index f6bfeba..a7c886c 100644 --- a/DailyQuest/DailyQuest/Domain/UseCases/Browse/DefaultBrowseUseCase.swift +++ b/DailyQuest/DailyQuest/Domain/UseCases/Browse/DefaultBrowseUseCase.swift @@ -18,13 +18,13 @@ final class DefaultBrowseUseCase { } extension DefaultBrowseUseCase: BrowseUseCase { - func excute() -> Observable<[BrowseQuest]> { + func excute() -> Single<[BrowseQuest]> { return browseRepository.fetch() } } final class BrowseMockRepo: BrowseRepository { - func fetch() -> RxSwift.Observable<[BrowseQuest]> { + func fetch() -> Single<[BrowseQuest]> { return .just([BrowseQuest(user: User(uuid: "", nickName: "test", profileURL: "", backgroundImageURL: "", introduce: "", allow: false), quests: [])]) } } diff --git a/DailyQuest/DailyQuest/Domain/UseCases/Browse/Protocols/BrowseUseCase.swift b/DailyQuest/DailyQuest/Domain/UseCases/Browse/Protocols/BrowseUseCase.swift index 4cbbe16..66f0b6d 100644 --- a/DailyQuest/DailyQuest/Domain/UseCases/Browse/Protocols/BrowseUseCase.swift +++ b/DailyQuest/DailyQuest/Domain/UseCases/Browse/Protocols/BrowseUseCase.swift @@ -10,5 +10,5 @@ import Foundation import RxSwift protocol BrowseUseCase { - func excute() -> Observable<[BrowseQuest]> + func excute() -> Single<[BrowseQuest]> } diff --git a/DailyQuest/DailyQuest/Domain/UseCases/Common/DefaultFriendCalendarUseCase.swift b/DailyQuest/DailyQuest/Domain/UseCases/Common/DefaultFriendCalendarUseCase.swift index 200d439..59d1c28 100644 --- a/DailyQuest/DailyQuest/Domain/UseCases/Common/DefaultFriendCalendarUseCase.swift +++ b/DailyQuest/DailyQuest/Domain/UseCases/Common/DefaultFriendCalendarUseCase.swift @@ -68,6 +68,7 @@ extension DefaultFriendCalendarUseCase { return self.questsRepository .fetch(by: self.user.uuid, date: date) + .asObservable() .map { quests -> DailyQuestCompletion in let isSelected = (try? self.selectedDate.value().startOfDay == date) ?? false diff --git a/DailyQuest/DailyQuest/Domain/UseCases/Common/DefaultFriendQuestUseCase.swift b/DailyQuest/DailyQuest/Domain/UseCases/Common/DefaultFriendQuestUseCase.swift index dd38790..a95e69e 100644 --- a/DailyQuest/DailyQuest/Domain/UseCases/Common/DefaultFriendQuestUseCase.swift +++ b/DailyQuest/DailyQuest/Domain/UseCases/Common/DefaultFriendQuestUseCase.swift @@ -18,7 +18,7 @@ final class DefaultFriendUseCase { } extension DefaultFriendUseCase: FriendQuestUseCase { - func fetch(with uuid: String, by date: Date) -> Observable<[Quest]> { + func fetch(with uuid: String, by date: Date) -> Single<[Quest]> { return questsRepository.fetch(by: uuid, date: date) } } diff --git a/DailyQuest/DailyQuest/Domain/UseCases/Common/Protocols/FriendQuestUseCase.swift b/DailyQuest/DailyQuest/Domain/UseCases/Common/Protocols/FriendQuestUseCase.swift index a8d8ce8..f522859 100644 --- a/DailyQuest/DailyQuest/Domain/UseCases/Common/Protocols/FriendQuestUseCase.swift +++ b/DailyQuest/DailyQuest/Domain/UseCases/Common/Protocols/FriendQuestUseCase.swift @@ -10,5 +10,5 @@ import Foundation import RxSwift protocol FriendQuestUseCase { - func fetch(with uuid: String, by date: Date) -> Observable<[Quest]> + func fetch(with uuid: String, by date: Date) -> Single<[Quest]> } diff --git a/DailyQuest/DailyQuest/Domain/UseCases/Home/DefaultEnrollUseCase.swift b/DailyQuest/DailyQuest/Domain/UseCases/Home/DefaultEnrollUseCase.swift index 0fffba6..b34d248 100644 --- a/DailyQuest/DailyQuest/Domain/UseCases/Home/DefaultEnrollUseCase.swift +++ b/DailyQuest/DailyQuest/Domain/UseCases/Home/DefaultEnrollUseCase.swift @@ -18,7 +18,7 @@ final class DefaultEnrollUseCase { } extension DefaultEnrollUseCase: EnrollUseCase { - func save(with quests: [Quest]) -> Observable { + func save(with quests: [Quest]) -> Single { return questsRepository .save(with: quests) .map { _ in @@ -29,6 +29,5 @@ extension DefaultEnrollUseCase: EnrollUseCase { let dates = quests.map { $0.date } NotificationCenter.default.post(name: .updated, object: dates) }) - .asObservable() } } diff --git a/DailyQuest/DailyQuest/Domain/UseCases/Home/DefaultQuestUseCase.swift b/DailyQuest/DailyQuest/Domain/UseCases/Home/DefaultQuestUseCase.swift index 974e063..5879606 100644 --- a/DailyQuest/DailyQuest/Domain/UseCases/Home/DefaultQuestUseCase.swift +++ b/DailyQuest/DailyQuest/Domain/UseCases/Home/DefaultQuestUseCase.swift @@ -18,11 +18,11 @@ final class DefaultQuestUseCase { } extension DefaultQuestUseCase: QuestUseCase { - func fetch(by date: Date) -> Observable<[Quest]> { + func fetch(by date: Date) -> Single<[Quest]> { return questsRepository.fetch(by: date) } - func update(with quest: Quest) -> Observable { + func update(with quest: Quest) -> Single { return questsRepository .update(with: quest) .do(onSuccess: { quest in @@ -32,6 +32,5 @@ extension DefaultQuestUseCase: QuestUseCase { }) .map { _ in true } .catchAndReturn(false) - .asObservable() } } diff --git a/DailyQuest/DailyQuest/Domain/UseCases/Home/DefaultUserUseCase.swift b/DailyQuest/DailyQuest/Domain/UseCases/Home/DefaultUserUseCase.swift index 4a5346d..886375f 100644 --- a/DailyQuest/DailyQuest/Domain/UseCases/Home/DefaultUserUseCase.swift +++ b/DailyQuest/DailyQuest/Domain/UseCases/Home/DefaultUserUseCase.swift @@ -27,36 +27,31 @@ extension DefaultUserUseCase: UserUseCase { .asObservable() } - func fetch() -> Observable { + func fetch() -> Single { return userRepository.readUser() .catchAndReturn(User()) - .asObservable() } - func save(with user: User) -> Observable { + func save(with user: User) -> Single { return userRepository.updateUser(by: user) .catchAndReturn(User()) - .asObservable() } - func saveProfileImage(data: Data) -> Observable { + func saveProfileImage(data: Data) -> Single { return userRepository.saveProfileImage(data: data) .catchAndReturn(false) - .asObservable() } - func saveBackgroundImage(data: Data) -> Observable { + func saveBackgroundImage(data: Data) -> Single { return userRepository.saveBackgroundImage(data: data) .catchAndReturn(false) - .asObservable() } - func delete() -> Observable { - guard let userRepository = userRepository as? ProtectedUserRepository else { return Observable.just(false) } + func delete() -> Single { + guard let userRepository = userRepository as? ProtectedUserRepository else { return Single.just(false) } return userRepository.deleteUser() .catchAndReturn(false) - .asObservable() } } diff --git a/DailyQuest/DailyQuest/Domain/UseCases/Home/HomeCalendarUseCase.swift b/DailyQuest/DailyQuest/Domain/UseCases/Home/HomeCalendarUseCase.swift index 04fd2da..d3975f0 100644 --- a/DailyQuest/DailyQuest/Domain/UseCases/Home/HomeCalendarUseCase.swift +++ b/DailyQuest/DailyQuest/Domain/UseCases/Home/HomeCalendarUseCase.swift @@ -148,6 +148,7 @@ extension HomeCalendarUseCase { return self.questsRepository .fetch(by: date) + .asObservable() .map { quests -> DailyQuestCompletion in let isSelected = (try? self.selectedDate.value().startOfDay == date) ?? false diff --git a/DailyQuest/DailyQuest/Domain/UseCases/Home/Protocols/EnrollUseCase.swift b/DailyQuest/DailyQuest/Domain/UseCases/Home/Protocols/EnrollUseCase.swift index 32f4db4..2e91122 100644 --- a/DailyQuest/DailyQuest/Domain/UseCases/Home/Protocols/EnrollUseCase.swift +++ b/DailyQuest/DailyQuest/Domain/UseCases/Home/Protocols/EnrollUseCase.swift @@ -10,5 +10,5 @@ import Foundation import RxSwift protocol EnrollUseCase { - func save(with quests: [Quest]) -> Observable + func save(with quests: [Quest]) -> Single } diff --git a/DailyQuest/DailyQuest/Domain/UseCases/Home/Protocols/QuestUseCase.swift b/DailyQuest/DailyQuest/Domain/UseCases/Home/Protocols/QuestUseCase.swift index 4d88349..94e5ae9 100644 --- a/DailyQuest/DailyQuest/Domain/UseCases/Home/Protocols/QuestUseCase.swift +++ b/DailyQuest/DailyQuest/Domain/UseCases/Home/Protocols/QuestUseCase.swift @@ -10,6 +10,6 @@ import Foundation import RxSwift protocol QuestUseCase { - func fetch(by date: Date) -> Observable<[Quest]> - func update(with quest: Quest) -> Observable + func fetch(by date: Date) -> Single<[Quest]> + func update(with quest: Quest) -> Single } diff --git a/DailyQuest/DailyQuest/Domain/UseCases/Home/Protocols/UserUseCase.swift b/DailyQuest/DailyQuest/Domain/UseCases/Home/Protocols/UserUseCase.swift index 138ccc9..ab9007d 100644 --- a/DailyQuest/DailyQuest/Domain/UseCases/Home/Protocols/UserUseCase.swift +++ b/DailyQuest/DailyQuest/Domain/UseCases/Home/Protocols/UserUseCase.swift @@ -10,11 +10,11 @@ import RxSwift protocol UserUseCase { func isLoggedIn() -> Observable - func fetch() -> Observable - func save(with user: User) -> Observable + func fetch() -> Single + func save(with user: User) -> Single - func saveProfileImage(data: Data) -> Observable - func saveBackgroundImage(data: Data) -> Observable + func saveProfileImage(data: Data) -> Single + func saveBackgroundImage(data: Data) -> Single - func delete() -> Observable + func delete() -> Single } diff --git a/DailyQuest/DailyQuest/Presentation/Common/ViewModel/FriendViewModel.swift b/DailyQuest/DailyQuest/Presentation/Common/ViewModel/FriendViewModel.swift index b934e0b..8975ed7 100644 --- a/DailyQuest/DailyQuest/Presentation/Common/ViewModel/FriendViewModel.swift +++ b/DailyQuest/DailyQuest/Presentation/Common/ViewModel/FriendViewModel.swift @@ -78,5 +78,6 @@ final class FriendViewModel { private extension FriendViewModel { func fetch(by date: Date) -> Observable<[Quest]> { return friendQuestUseCase.fetch(with: user.uuid, by: date) + .asObservable() } } diff --git a/DailyQuest/DailyQuest/Presentation/Home/ViewModel/ProfileViewModel.swift b/DailyQuest/DailyQuest/Presentation/Home/ViewModel/ProfileViewModel.swift index 840ccb2..aae8f52 100644 --- a/DailyQuest/DailyQuest/Presentation/Home/ViewModel/ProfileViewModel.swift +++ b/DailyQuest/DailyQuest/Presentation/Home/ViewModel/ProfileViewModel.swift @@ -56,6 +56,7 @@ final class ProfileViewModel { return self.userUseCase.saveProfileImage(data: data) .map{ _ in image } .catchAndReturn(nil) + .asObservable() }.map{ _ in Void() }.flatMap(userUseCase.fetch)