Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swiftui 当Timer.TimerPublisher启动时,@ObservableObject视图模型为什么会重置?_Swiftui_Combine - Fatal编程技术网

Swiftui 当Timer.TimerPublisher启动时,@ObservableObject视图模型为什么会重置?

Swiftui 当Timer.TimerPublisher启动时,@ObservableObject视图模型为什么会重置?,swiftui,combine,Swiftui,Combine,我有一个出售计时器的类型。TimerPublisher,您可以在下面看到: 导入联合收割机 进口基金会 结构时间客户端{ //马克:财产 var timerValueChange:()->AnyPublisher //标记:初始化 初始化( timerValueChange:@escaping()->AnyPublisher ) { self.timerValueChange=timerValueChange } } 延长时间限制{ //马克:财产 静态var-live:Self{ 自我{ 返回

我有一个出售计时器的类型。TimerPublisher,您可以在下面看到:

导入联合收割机
进口基金会
结构时间客户端{
//马克:财产
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。我希望在这个小项目中,无论我在哪里都可以使用它,即使它是多余的,这样我就可以更轻松地使用它。