簡體   English   中英

iOS開發人員:在NSRunLoop中,timeIntervalSince1970未更新

[英]iOS dev: timeIntervalSince1970 not updating when in a NSRunLoop

我對iOS開發還很陌生,所以對不起,我感到抱歉。

但是對於我一生來說,我無法弄清楚為什么當我在Objective-C的Loop中調用(NSTimeInterval)timeIntervalSince1970時,它會在第一次運行時獲取該值,並且根本不會在那里更新。 我在循環中使控制台輸出當前時間,並且始終保持相同:

我用它來打印它:

NSLog([NSString stringWithFormat:@"time: %f",(float)[[NSDate date] timeIntervalSince1970]]);

這是控制台輸出:

    GNU gdb 6.3.50-20050815 (Apple version gdb-1708) (Mon Aug 15 16:03:10 UTC 2011)
Copyright 2004 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for details.
This GDB was configured as "x86_64-apple-darwin".Attaching to process 557.
2012-07-28 13:17:01.801 QuitSmoking SideKick[557:207] number of times: 24 this app has been launched
2012-07-28 13:17:01.805 QuitSmoking SideKick[557:207] LOADED VIEW CONTROLLER
2012-07-28 13:17:01.806 QuitSmoking SideKick[557:207] time: 1343477760.000000
2012-07-28 13:17:02.807 QuitSmoking SideKick[557:207] time: 1343477760.000000
2012-07-28 13:17:03.807 QuitSmoking SideKick[557:207] time: 1343477760.000000
2012-07-28 13:17:04.807 QuitSmoking SideKick[557:207] time: 1343477888.000000
2012-07-28 13:17:05.807 QuitSmoking SideKick[557:207] time: 1343477888.000000
2012-07-28 13:17:06.807 QuitSmoking SideKick[557:207] time: 1343477888.000000
2012-07-28 13:17:07.807 QuitSmoking SideKick[557:207] time: 1343477888.000000
2012-07-28 13:17:08.807 QuitSmoking SideKick[557:207] time: 1343477888.000000
2012-07-28 13:17:09.807 QuitSmoking SideKick[557:207] time: 1343477888.000000
2012-07-28 13:17:10.807 QuitSmoking SideKick[557:207] time: 1343477888.000000
2012-07-28 13:17:11.807 QuitSmoking SideKick[557:207] time: 1343477888.000000
2012-07-28 13:17:12.807 QuitSmoking SideKick[557:207] time: 1343477888.000000
2012-07-28 13:17:13.807 QuitSmoking SideKick[557:207] time: 1343477888.000000
2012-07-28 13:17:14.807 QuitSmoking SideKick[557:207] time: 1343477888.000000
2012-07-28 13:17:15.807 QuitSmoking SideKick[557:207] time: 1343477888.000000
2012-07-28 13:17:16.807 QuitSmoking SideKick[557:207] time: 1343477888.000000

我的Iphone應用程序會計算自首次安裝該應用程序以來所節省的金額。 它具有一個計算函數,該函數被稱為[calulateMoney]的循環的每次迭代,該函數花費用戶從NSUserDefaults啟動的時間,並將其與其他因素相對於當前時間。

我使用在-(void)ViewDidLoad中運行的以下代碼開始循環:

    NSRunLoop *runloop = [NSRunLoop currentRunLoop];

timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(calculateMoney) userInfo:nil repeats:YES];

[runloop addTimer:timer forMode:NSRunLoopCommonModes];
[runloop addTimer:timer forMode:UITrackingRunLoopMode];

最后是這里的方法(很抱歉,如果這是一個錯誤的術語,我通常是Java),我調用它來計算貨幣:

    //method that performs math on the score against the cost of a smoke and how many seconds have passed.
-(IBAction) calculateMoney
{
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];

    NSString *packSize = [defaults objectForKey:@"packSize"];

    NSString *packCost = [defaults objectForKey:@"packCost"];

    NSString *dailyCigs = [defaults objectForKey:@"dailyCigs"];

    NSDate *timer_date = [NSDate date];

   // float current_time = [[NSDate date] timeIntervalSince1970];

    int size = [packSize intValue];
    int daily = [dailyCigs intValue];
    float cost = [packCost floatValue];

    NSLog([NSString stringWithFormat:@"time: %f",(float)[[NSDate date] timeIntervalSince1970]]);

    //current time doesn't log further than the time it's initialized. RESEARCH NEEDED.
    float seconds =  (float)[[NSDate date] timeIntervalSince1970] -[[defaults objectForKey:@"firstLogTime"]floatValue];

    float calcPart1 = (float) daily/size;
  //  NSLog([NSString stringWithFormat:@"calc 1: %f",calcPart1]);
    float calcPart2 = (float) calcPart1 * cost;
  //  NSLog([NSString stringWithFormat:@"calc 2: %f",calcPart2]);
    float calcPart3 = (float) calcPart2 / (24*60*60);
 //   NSLog([NSString stringWithFormat:@"calc 3: %f",calcPart3]);
    float result = (float) calcPart3 * seconds;
  //  NSLog([NSString stringWithFormat:@"result: %f",result]);


    money.text= [NSString stringWithFormat:@"%f", result];

    [money sizeToFit];

}

我可以提供您可能需要的其他任何信息,目前我正在整理頭發。 我只是不明白為什么時間沒有更新。

因此,問題在於[[NSDate date] timeIntervalSince1970]返回一個double,並且在將其截斷為float時會得到此錯誤的值。 對所有浮點類型使用雙精度字,問題將消失:

    NSLog(@"time: %lf", [[NSDate date] timeIntervalSince1970]);


2012-07-28 11:17:42.200 TimeTester[22022:f803] time: 1343488662.200260
2012-07-28 11:17:43.200 TimeTester[22022:f803] time: 1343488663.200198
2012-07-28 11:17:44.200 TimeTester[22022:f803] time: 1343488664.200264
2012-07-28 11:17:45.200 TimeTester[22022:f803] time: 1343488665.200141
2012-07-28 11:17:46.200 TimeTester[22022:f803] time: 1343488666.200046
2012-07-28 11:17:47.199 TimeTester[22022:f803] time: 1343488667.199891
2012-07-28 11:17:48.200 TimeTester[22022:f803] time: 1343488668.200030
2012-07-28 11:17:49.199 TimeTester[22022:f803] time: 1343488669.199775
2012-07-28 11:17:50.199 TimeTester[22022:f803] time: 1343488670.199782

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM