Swiftui 当Timer.TimerPublisher启动时,@ObservableObject视图模型为什么会重置?
我有一个出售计时器的类型。TimerPublisher,您可以在下面看到:Swiftui 当Timer.TimerPublisher启动时,@ObservableObject视图模型为什么会重置?,swiftui,combine,Swiftui,Combine,我有一个出售计时器的类型。TimerPublisher,您可以在下面看到: 导入联合收割机 进口基金会 结构时间客户端{ //马克:财产 var timerValueChange:()->AnyPublisher //标记:初始化 初始化( timerValueChange:@escaping()->AnyPublisher ) { self.timerValueChange=timerValueChange } } 延长时间限制{ //马克:财产 静态var-live:Self{ 自我{ 返回
导入联合收割机
进口基金会
结构时间客户端{
//马克:财产
var timerValueChange:()->AnyPublisher
//标记:初始化
初始化(
timerValueChange:@escaping()->AnyPublisher
) {
self.timerValueChange=timerValueChange
}
}
延长时间限制{
//马克:财产
静态var-live:Self{
自我{
返回计时器
.TimerPublisher(
间隔时间:1,
运行循环:。主,
模式:。常见
)
.自动连接()
.share()
.删除任何发布者()
}
}
}
我有一个视图
,用于保存新事件。它被注入了一个使用TimerClient
的视图模型,这样,如果用户试图用过去的日期保存事件,我就可以禁用Save
按钮:
import Combine
final class CountdownEventEntryViewModel: ObservableObject {
// MARK: Properties
private let nowSubject = CurrentValueSubject<Date, Never>(Date())
private let calendar: Calendar
private let timerClient: TimerClient
private var cancellables = Set<AnyCancellable>()
@Published var eventTitle = ""
@Published var isAllDay = false
@Published var eventDate = Date()
@Published var eventTime = Date()
@Published var shouldDisableSaveButton = true
// MARK: Initialization
init(
calendar: Calendar = .autoupdatingCurrent,
timerClient: TimerClient
) {
self.calendar = calendar
self.timerClient = timerClient
observeTimer()
observeCurrentDateChanges()
}
// MARK: UI Configuration
private func disableSaveButton() -> Bool {
if eventTitle.trimmingCharacters(in: .whitespaces).isEmpty {
return true
}
if isAllDay {
let startOfToday = calendar.startOfDay(for: nowSubject.value)
let startOfSelectedDate = calendar.startOfDay(for: eventDate)
return startOfSelectedDate <= startOfToday
} else {
return normalizedSelectedDate() <= nowSubject.value
}
}
private func observeTimer() {
timerClient.timerValueChange().sink(receiveValue: { [weak self] newDate in
self?.nowSubject.send(newDate)
})
.store(in: &cancellables)
}
private func observeCurrentDateChanges() {
nowSubject.sink(receiveValue: { [weak self] _ in
self?.shouldDisableSaveButton = self?.disableSaveButton() ?? false
})
.store(in: &cancellables)
}
}
取消条目视图后,显示已保存事件的列表将根据以下视图模型进行更新:
导入联合收割机
导入CoreData
最终类CountdownEventsViewModel:NSObject、ObservableObject、NSFetchedResultsControllerDelegate{
//马克:财产
私人租赁日历:日历
私人出租timerClient:timerClient
private var cancelables=Set。请确保使用save countdown events
分支。此外,我正在无点(),如果这有助于提供更多的上下文。这里确实有很多代码。调试问题的一个好方法是尝试通过删除不相关的内容来隔离问题,这并非巧合,也会通过一个最小的可重复示例导致一个更集中的问题。你能尝试最小化它吗?另外,为什么只使用计时器y来检查时间是否不是过去的。您不需要计时器,只需调用
Date()`为了获得当前时间并比较`@NewDev-Sure,我将尝试减少代码并提供一个更精简的示例。我使用计时器只是因为我试图更好地理解Combine。我希望在这个小项目中,无论我在哪里都可以使用它,即使它是多余的,这样我就可以更轻松地使用它。