時間 iOS

轉自http://mp.weixin.qq.com/s/cSZUNMuqk6DL3-nctyxzcw 部分文章。


我們做性能優(yōu)化的時候,經常需要對某個方法執(zhí)行的時間做記錄,就必然會用到上面提到的一些獲取時間的方法。

#define TICK? NSDate *startTime = [NSDate date]

#define TOCK? NSLog(@"Time Cost: %f", -[startTime timeIntervalSinceNow])


客戶端和服務器之間的時間同步

思路:首先還是會依賴于接口和服務器時間做同步,每次同步記錄一個serverTime(Unix time),同時記錄當前客戶端的時間值lastSyncLocalTime,到之后算本地時間的時候先取curLocalTime,算出偏移量,再加上serverTime就得出時間了:

uint64_t realLocalTime = 0;

if (serverTime != 0 && lastSyncLocalTime != 0) {

realLocalTime = serverTime + (curLocalTime - lastSyncLocalTime);

}else {

realLocalTime = [[NSDate date] timeIntervalSince1970]*1000;

}

如果從來沒和服務器時間同步過,就只能取本地的系統(tǒng)時間了,這種情況幾乎也沒什么影響,說明客戶端還沒開始用過。

//get system uptime since last boot

- (NSTimeInterval)uptime

{

struct timeval boottime;

int mib[2] = {CTL_KERN, KERN_BOOTTIME};

size_t size = sizeof(boottime);

struct timeval now;

struct timezone tz;

gettimeofday(&now, &tz);

double uptime = -1;

if (sysctl(mib, 2, &boottime, &size, NULL, 0) != -1 && boottime.tv_sec != 0)

{

uptime = now.tv_sec - boottime.tv_sec;

uptime += (double)(now.tv_usec - boottime.tv_usec) / 1000000.0;

}

return uptime;

}

gettimeofday和sysctl都會受系統(tǒng)時間影響,但他們二者做一個減法所得的值,就和系統(tǒng)時間無關了。這樣就可以避免用戶修改時間了。當然用戶如果關機,過段時間再開機,會導致我們獲取到的時間慢與服務器時間,真實場景中,慢于服務器時間往往影響較小,我們一般擔心的是客戶端時間快于服務器時間。

多和服務器做時間同步,再把關鍵的時間校驗邏輯放在Server端,就不會出現(xiàn)什么意外的bug了。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 場景 我們經常遇到這樣的場景,比如電商類App到零點的時候開始搶購,比如商品限購倒計時等等。這種場景下需要我們將客...
    zhangbo1992閱讀 4,861評論 10 39
  • 大綱 一.Socket簡介 二.BSD Socket編程準備 1.地址 2.端口 3.網(wǎng)絡字節(jié)序 4.半相關與全相...
    VD2012閱讀 2,705評論 0 5
  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,678評論 19 139
  • 1.NSLog(@"%@",[[UIDevice currentDevice] systemVersion]);/...
    Y像夢一樣自由閱讀 10,849評論 3 12
  • 近年來無上班事,帶孩子,成了生活的全部。的確單調,所以會追劇,頗愛古裝,看了許多,武則天、甄嬛傳、羋月傳等等,都很...
    楊子今閱讀 350評論 0 0

友情鏈接更多精彩內容