[英]How can my Cocoa application be notified of onClick events in a WebView?
[英]How can I get notified of a system time change in my Cocoa application?
我有一個Cocoa應用程序,記錄事件的日期戳。 我需要知道系統時間何時重置以及重置多少,但我似乎無法在任何告知我發生過這種情況的通知。 這種變化可能發生,因為NTP重置時鍾或因為用戶重置(例如從系統偏好設置)。 如果只有我可以注冊接收的NSNotification
會很棒,但我願意接受任何建議。
Apple在Snow Leopard(10.6)的NSSateClockDidChangeNotification中加入了NSDate的一部分。 似乎沒有辦法在Leopard(10.5)或更早版本中執行此操作。 根據Apple NSDate文檔 :
系統時鍾更改時發布。 這可以通過調用settimeofday()或用戶更改“日期和時間首選項”面板中的值來啟動。 通知對象為null。 此通知不包含userInfo字典。
這似乎並沒有告訴你“多少”時間已經改變。 您可以通過定期(例如,在NSTimer
每隔5秒)使用[NSDate date]
捕獲系統時間,將其保存到變量中,然后在NSSystemClockDidChangeNotification
觸發后,抓住新日期並使用NSDate將兩者進行比較來計算timeIntervalSinceDate:
獲取差異的方法。
不是毫秒甚至是第二准確,但非常接近。
編輯:看這篇文章 。 您可以使用UpTime()
C命令來獲取CPU tics中的系統正常運行時間(稍后可以將其轉換為秒)。 您可以使用它來計算出更改的時間(假設沒有系統重啟或休眠)。 即使系統時鍾被用戶或網絡時間協議更改,這也可以工作。
如果有人正在尋找解決方案,請知道系統日期更改事件從10.4開始
OSStatus DateChangeEventHandler(EventHandlerCallRef nextHandler, EventRef theEvent, void *userData)
{
NSLog(@"Event received!\n");
return 0;
}
- (void)SystemTimeChangeHandler
{
EventTypeSpec eventType;
eventType.eventClass = kEventClassSystem;
eventType.eventKind = kEventSystemTimeDateChanged;
EventHandlerUPP eventHandlerUPP =
NewEventHandlerUPP(DateChangeEventHandler);
EventHandlerRef eventHandlerRef = NULL;
(void)InstallApplicationEventHandler(
eventHandlerUPP,
1,
&eventType,
self,
&eventHandlerRef);
}
時間不斷變化。 每當當前時間改變時的通知將是一個恆定的,CPU浸泡的通知流。
您需要做的是獲取事件處理程序中的當前時間 - 接收您正在進行日期戳記的事件的時間。 您可以通過調用[NSDate date]
獲取當前時間。
我認為沒有一種方法可以做到這一點,因為時間可以改變的機制不同。 但它不會非常昂貴(太貴了?不知道,你有沒有對它進行分析?;-)每秒設置一次NSTimer
以檢查時間並將其與之前的值進行比較。 如果它沒有提前約一秒鍾,就會發生一些有趣的事情,你可以通知你的審計對象。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.