         vEvents.asObservable()
             .skip(1)
             .subscribe(onNext: { [unowned self] events in
-                self.rxTimer?.invalidate()
-                let userInfo = events
-                self.rxTimer = Timer.scheduledTimer(timeInterval: 2, target: self, selector: #selector(self.eventChanged(timer:)), userInfo: userInfo, repeats: false)
-            })
-            .disposed(by: disposeBag)
-    }
-        
-    @objc private func eventChanged(timer:Timer) {
+                let twoSeconds = DispatchTime(uptimeNanoseconds: 2 * 1000_0000_000)
+                self.dispatchWorkItem?.cancel()
+                self.dispatchWorkItem = DispatchWorkItem(block: { [unowned self] in
+                    self.eventChanged(events:events)
+                })
+                DispatchQueue.main.asyncAfter(deadline: twoSeconds, execute: self.dispatchWorkItem!)
+            })
+            .disposed(by: disposeBag)
+    }
+        
+    private func eventChanged(events:[EKEvent]) {
         defer { self.setupRxNotification() }
         // MARK: - keep data in Realm is updated
-        let events = timer.userInfo as! [EKEvent]
-        let realm = try! Realm()
-        for crEvent in self.crEvents {
+        let realm = crEvents.realm!
+        for crEvent in crEvents {
             let event = self.store.event(withIdentifier: crEvent.calendarItemIdentifier)
             let reminder = self.store.calendarItem(withIdentifier: crEvent.reminder!.calendarItemIdentifier) as? EKReminder
             

        }
        
        // deal with new events
        let eventsFromCREvents:[EKEvent] = self.crEvents
            .map { self.store.event(withIdentifier: $0.calendarItemIdentifier) }
            .filter { $0 != nil }
            .map { $0! }

        
        NotificationCenter.default.rx.notification(.NSCalendarDayChanged)
            .observeOn(MainScheduler.asyncInstance)
            .subscribe(onNext: { [unowned self] _ in
                self.dailyCleanUp()
                self.notificationDealer()
            })
            .disposed(by:disposeBag)
    }
    
