7

我正在测试和调试- beginBackgroundTaskWithExpirationHandler:.

有没有办法强制 Block 调用以便它更快地发生,而不是每次我需要调试它时等待大约 10 分钟?

我对调试块中的实际代码不感兴趣,而是对调用顺序和回溯等感兴趣;这就是为什么我需要回调本身发生,但每次 10 分钟太长了!

4

2 回答 2

0

模拟后台任务时间到期:

  1. 在控制器上启动您的后台任务viewDidLoad并安排每 1 秒Timer打印一次。backgroundTimeRemaining
  2. 将您的应用程序发送到后台。
  3. backgroundTimeRemaining小于 X 秒时触发后台任务的操作。

X 可以通过测试何时触发过期处理程序来知道。因为不保证 backgroundTimeRemaining 是准确的。

代码:

UIApplication.shared.beginBackgroundTask(withName: "Submit Order Background Task") { [weak self] in
     // Your logic to handle the expiration.
}

// To submit order 1 time!
var submitted = false

Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true) { (timer) in
    print("background task timer: \(UIApplication.shared.backgroundTimeRemaining)")
        
    if UIApplication.shared.backgroundTimeRemaining < 2 && !submitted {
        self.submitOrder()
        submitted = true
    }
}
于 2021-04-05T08:46:35.130 回答
-2

如果您希望强制系统调用过期块,我认为这是不可能的。但是,我建议您隔离后台任务块,然后使用NSTimer或调用它

- (void)performSelector:(SEL)aSelector withObject:(id)anArgument afterDelay:(NSTimeInterval)delay

至少我会这样做。

这意味着,您将直接使用NSTimer(隐含或显式)调用到期处理程序中的代码。因此,如果在过期处理程序中调用了处理过期的方法。然后,您将为在“后台任务”生命周期之外调用该方法设置一个计时器,但您只是模拟它。

于 2013-08-28T04:24:52.687 回答