У меня есть такой фрагмент кода
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
издателем.