第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

今天看到一道很有意思的面試題,想了半天也不得其解,想上來問問大家。

今天看到一道很有意思的面試題,想了半天也不得其解,想上來問問大家。

iOS
慕神8447489 2023-05-02 17:13:31
怎么實(shí)現(xiàn)一個(gè)精準(zhǔn)的Timer?我寫了如下的代碼進(jìn)行測試。1. 在主線程中。NSTimer *tiemer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(output) userInfo:nil repeats:YES]; - (void) output{    NSLog(@"-------------"); }發(fā)現(xiàn)間隔時(shí)間大概在正負(fù)5毫秒之間徘徊。就像這樣:2013-05-02 16:25:32.550 TestDemoArc[21139:907] -------------2013-05-02 16:25:33.549 TestDemoArc[21139:907] -------------2013-05-02 16:25:34.554 TestDemoArc[21139:907] -------------2013-05-02 16:25:35.555 TestDemoArc[21139:907] -------------如果在主線程中做一些操作,比如:    int j = 0;     for (int i = 0; i<100000000; i++) {         j = j+i;    }時(shí)間間隔會(huì)變?yōu)閮擅?。就像這樣:2013-05-02 16:38:32.437 TestDemoArc[21207:907] -------------2013-05-02 16:38:34.437 TestDemoArc[21207:907] -------------2013-05-02 16:38:36.437 TestDemoArc[21207:907] -------------2013-05-02 16:38:38.439 TestDemoArc[21207:907] -------------2013-05-02 16:38:40.437 TestDemoArc[21207:907] -------------當(dāng)然,用block放到子線程里就只有1毫秒左右的偏差了?,F(xiàn)在想問怎么做一個(gè)Timer,保證有在1毫秒以下的偏差。
查看完整描述

2 回答

?
絕地?zé)o雙

TA貢獻(xiàn)1946條經(jīng)驗(yàn) 獲得超4個(gè)贊

IOS中可以使用"mach_absolute_time"獲取到CPU的tickcount的計(jì)數(shù)值,可以通過"mach_timebase_info"函數(shù)獲取到納秒級(jí)的精確度 代碼如下: uint64t start = 0; uint64t end = 0; uint64_t elapsed = 0;

mach_timebase_info_t timeBaseInfo = mach_timebase_info(info);start = mach_absolute_time();// dosomething
// .....end = mach_absolute_time();elapsed = end - start;// convert to nanoseconds
uint64_t elapsedNanoSeconds = elapsed * sTimebaseInfo.numer / sTimebaseInfo.denom;

但是CPU線程之間的調(diào)度肯定要花費(fèi)時(shí)間,所以只能盡可能的精確。


查看完整回答
反對(duì) 回復(fù) 2023-05-04
?
郎朗坤

TA貢獻(xiàn)1921條經(jīng)驗(yàn) 獲得超9個(gè)贊

計(jì)時(shí)器不準(zhǔn)確的原因是,計(jì)時(shí)器只有在 runLoop 的一次循環(huán)中被檢查,所以如果在上次循環(huán)中做了什么耗時(shí)的操作,那么計(jì)時(shí)器就被延后執(zhí)行了。

正確的方法應(yīng)該是新開一個(gè)線程,然后在新開的線程里設(shè)定一個(gè) timer,并執(zhí)行。

__block TestViewController *blockSelf = self;dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    blockSelf->_timer=[NSTimer scheduledTimerWithTimeInterval:1.0
                                            target:blockSelf
                                        selector:@selector(caculateLeftTimeForTomorrow)
                                          userInfo:nil
                                           repeats:YES] ;
    [[NSRunLoop currentRunLoop] addTimer:blockSelf->_timer forMode:NSDefaultRunLoopMode];
    [[NSRunLoop currentRunLoop] run];
});


查看完整回答
反對(duì) 回復(fù) 2023-05-04
  • 2 回答
  • 0 關(guān)注
  • 365 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)