Ios 如何创建日期计划表?

Ios 如何创建日期计划表?,ios,swift,reactive-cocoa,reactive-swift,Ios,Swift,Reactive Cocoa,Reactive Swift,我正在尝试创建一个日期计划程序来观察一些事件。但它不起作用。我已经看过了 协议日期调度器 据说,在某些方法中,协议日期调度程序会在当前日期执行操作。我试着在10秒后这样做。下面是我的自定义时间表的一个示例 class SomeDateScheduler : DateScheduler { var currentDate: Date init() { self.currentDate = Date(timeIntervalSinceNow: 10) } func schedule(aft

我正在尝试创建一个日期计划程序来观察一些事件。但它不起作用。我已经看过了

协议日期调度器

据说,在某些方法中,协议日期调度程序会在当前日期执行操作。我试着在10秒后这样做。下面是我的自定义时间表的一个示例

class SomeDateScheduler : DateScheduler {
var currentDate: Date
init() {
    self.currentDate = Date(timeIntervalSinceNow: 10)
}

func schedule(after date: Date, action: @escaping () -> Void) -> Disposable? {
    print(#function)
    print(date)
    return nil
}

func schedule(after date: Date, interval: DispatchTimeInterval, leeway: DispatchTimeInterval, action: @escaping () -> Void) -> Disposable? {
    print(#function)
    print(date)
    print(interval)
    print(leeway)
    return nil
}

func schedule(_ action: @escaping () -> Void) -> Disposable? {
    print(#function)
    return nil
}
}

然后我创建bind来观察事件

private func testSchedular() {
    let schedular = SomeDateScheduler()

    reactive.makeBindingTarget { appDeleg, value in
        print("SUCCESS")
        print(value)
        } <~ signalSchedular.observe(on: schedular)

    DispatchQueue.main.async { [observerSchedular] in
        observerSchedular.send(value: "Hello World")
        observerSchedular.sendCompleted()
    }
}
private func testSchedular(){
设schedular=SomeDateScheduler()
reactive.makeBindingTarget{appDeleg,中的值
打印(“成功”)
打印(值)

}我已经明白我在哪里犯了错误。为了纠正错误,我下一步做了:

  • 创建了自定义的
    observe(on:Schedular)
    。因此它看起来是这样的(在
    信号的扩展中添加这些函数)
  • 并模拟异步代码

  • 定义的全局属性
  • func customObserve(on scheduler: DateScheduler, interval: Int, leeway: Int) -> Signal<Value, Error> {
        return customFlatMapEvent(Signal.Event.observe(on: scheduler, interval: DispatchTimeInterval.seconds(interval), leeway: DispatchTimeInterval.seconds(leeway)))
    }
    
    
    func customFlatMapEvent<U, E>(_ transform: @escaping Event.CustomTransformation<U, E>) -> Signal<U, E> {
        return Signal<U, E> { output, lifetime in
            let input = transform(output.send, lifetime)
            lifetime += self.observe(input)
        }
    }
    
    extension Signal.Event {
        typealias CustomTransformation<U, E: Swift.Error> = (@escaping Signal<U, E>.Observer.Action, Lifetime) -> Signal<Value, Error>.Observer.Action
        
        static func observe(on scheduler: DateScheduler, interval: DispatchTimeInterval, leeway: DispatchTimeInterval) -> CustomTransformation<Value, Error> {
            return { action, lifetime in
                lifetime.observeEnded {
                    scheduler.schedule {
                        action(.interrupted)
                    }
                }
    
                return { event in
                    scheduler.schedule(after: scheduler.currentDate, interval: interval, leeway: leeway) {
                        if !lifetime.hasEnded {
                            action(event)
                        }
                    }
                }
            }
        }
    }
    
    reactive.makeBindingTarget { appDeleg, value in
        print("SUCCESS")
        print(value)
        } <~ signalSchedular.customObserve(on: schedular, interval: 10, leeway: 1)
    
    
    DispatchQueue.main.async { [observerSchedular] in
           observerSchedular.send(value: "Hello World")
           observerSchedular.sendCompleted()
    }
    
    
    private let (signalSchedular, observerSchedular) = Signal<String, Never>.pipe(),
    let schedular = SomeDateScheduler()
    
    class SomeDateScheduler : DateScheduler {
        var currentDate: Date
        init() {
            self.currentDate = Date()
        }
        
        func schedule(after date: Date, action: @escaping () -> Void) -> Disposable? {
            action()
            return nil
        }
        
        func schedule(after date: Date, interval: DispatchTimeInterval, leeway: DispatchTimeInterval, action: @escaping () -> Void) -> Disposable? {
            if case .seconds(let sec) = interval {
                let time = DispatchTime.now() + DispatchTimeInterval.seconds(sec)
                let queue = DispatchQueue(label: "sads", qos: .utility, attributes: .concurrent)
                queue.asyncAfter(deadline: time) { [weak self] in
                    _ = self?.schedule(after: date) {
                        action()
                    }
                }
    
    
                DispatchQueue.main.asyncAfter(deadline: time) { [weak self] in
                    _ = self?.schedule(after: date) {
                        action()
                    }
                }
            }
            return nil
        }
        
        func schedule(_ action: @escaping () -> Void) -> Disposable? {
            action()
            return nil
        }
    }