2016-06-16 39 views
1

據我所知,還有的iOS應用程序生命週期的兩個不同的階段,當它被隱藏:爲什麼NSTimer在應用程序暫停時持續發射?

  • 背景 - 當我們仍然能夠進行計算和運行代碼;
  • 暫停 - 當任何計算被凍結,我們無法做任何事情,直到用戶返回到應用程序。

,所以我有點困惑一個下面的例子:

- (void)applicationDidEnterBackground:(UIApplication *)application { 
    (void)(^expirationHandler)() = [^{ 
     [application endBackgroundTask:bgTask]; 
     self.bgTask = UIBackgroundTaskInvalid; 
    } copy]; 
    self.bgTask = [application beginBackgroundTaskWithName:@"MyTask" expirationHandler:expirationHandler]; 
    [NSTimer scheduledTimerWithTimeInterval:1.0 
            target:self 
            selector:@selector(count) 
            userInfo:nil 
            repeats:YES]; 
    expirationHandler(); 
} 

- (void)count { 
    int i = 0; 
    while (i < 10000000) { 
     i++; 
    } 
    NSLog(@"%d", i); 
} 

附:我從內存中複製它,讓我知道是否有錯,但問題與片段的正確性無關。

我在iOS 6+上測試了它,並且指定的定時器持續觸發,此外count方法執行代碼(您可以通過i值檢查它)。定時器之後,我的應用程序必須進入暫停狀態嗎?如果是這樣,爲什麼count能夠執行代碼?

在此先感謝。

+0

你能告訴我們'bgTask'的聲明嗎?它是一個實例變量?我試圖排除你在塊中捕獲的是一個值,而不是一個參考。 – Tommy

+0

這是樣本中的ivar,但我認爲即使使用本地'__block'變量也會得到相同結果 –

+3

您是否在Xcode中的調試器下運行時進行測試?如果是這樣,那麼你的應用程序沒有後臺時間限制或被暫停 – Paulw11

回答

0

按在評論@Paulw11

你測試在Xcode中調試器下運行時?如果是這樣,那麼你的應用程序沒有後臺時間限制或暫停

我還沒有找到任何證據,但通過實證調查,它似乎是真實的。