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
能夠執行代碼?
在此先感謝。
你能告訴我們'bgTask'的聲明嗎?它是一個實例變量?我試圖排除你在塊中捕獲的是一個值,而不是一個參考。 – Tommy
這是樣本中的ivar,但我認爲即使使用本地'__block'變量也會得到相同結果 –
您是否在Xcode中的調試器下運行時進行測試?如果是這樣,那麼你的應用程序沒有後臺時間限制或被暫停 – Paulw11