Объединение flatMap или map + switchToLast не работает должным образом - PullRequest
0 голосов
/ 06 марта 2020

У меня есть такой фрагмент кода

lazy var loggedUser: AnyPublisher<User?, Never> = {

        UserDefaults().publisher(for: UserDefaultKey.UserId, defaultValue: "")
        .map { userId -> AnyPublisher<User?, Never> in
                if userId.isNotEmpty {
                    let user = try? UserDao.loadUser(context: CoreDataStorage.shared.mainContext, id: self.userId)
                    return Just(user).eraseToAnyPublisher()
                    /*
                    let fetchRequest : NSFetchRequest<User> = User.fetchRequest()
                    fetchRequest.predicate = NSPredicate(format: "id == %@", userId)
                    fetchRequest.sortDescriptors = []

                    return CoreDataStorage.shared.mainContext.objectsPublisher(fetchRequest: fetchRequest)
                        .map { $0.first }
                        .replaceError(with: nil)
                        .eraseToAnyPublisher()
                    */
                } else {
                    return Just(nil).eraseToAnyPublisher()
                }
        }
        .switchToLatest()
        .eraseToAnyPublisher()
    }()

Некомментированная часть работает нормально, когда я выхожу из системы, после чего из UserDefault публикуется новый userId и выполняется запрос, а новый User? публикуется в

Но когда я использовал flatMap() или map() + switchToLatest() с комментируемым кодом для каждого отправляемого пользователя. Я создаю нового издателя из CoreData FetchRequest (он публикует всегда, когда есть изменения в CoreData с использованием уведомлений NSFetchResultsController), тогда я всегда публикуюсь Пользователь? для первого идентификатора пользователя и этого источника публикации изменяется на основе нового идентификатора пользователя, предоставленного внешним UserDefault издателем.

...