WKBackgroundRefreshTask在返回之前被dealloc

问题描述 投票:0回答:1

我在WatchOS 5中遇到WatchKit应用程序崩溃时出现问题。当我的系统调用我的应用程序让我更新复杂功能时,这种情况会在后台发生。

当我得到WKApplicationBackgroundRefreshTask时,会在后台调用此处的代码片段:

    func handle(_ backgroundTasks: Set<WKRefreshBackgroundTask>) {
    for task in backgroundTasks {
        switch task {
        case let backgroundTask as WKApplicationRefreshBackgroundTask:
                HealthController().updateComplicationData {
                    self.updateComplications()
                    if #available(watchOSApplicationExtension 4.0, *) {
                        backgroundTask.setTaskCompletedWithSnapshot(false)
                    } else { task.setTaskCompleted()}
            }

问题是,我得到的崩溃基本上说:

[WKRefreshBackgroundTask dealloc]

所以我知道,如果HealthController()。updateComplicationData()函数返回时间太长,可能会发生这种情况。但崩溃并不意味着应用程序因cpu时间问题而被杀死。似乎实际的backgroundTask变量正在被释放,因此当backgroundTask.setTaskCompletedWithSnapshot(false)调用发生时,我传递一个解除分配的对象。

有什么建议?

  1. 我可以以某种方式使backgroundTask变量不被取消分配吗?
  2. 我对崩溃的原因有什么不对吗?我错过了别的什么?
  3. 我只是被迫找到一种方法来减少HealthController().updateComplicationData产生的负荷?

谢谢你的帮助!

ios swift watchkit apple-watch
1个回答
-1
投票

我终于解决了这个问题,其他人都经历过这个问题!基本上,我在后台刷新中有一个奇怪的代码路径,偶尔会调用finishedBackgroundUpdate处理程序。因为这个WatchKit正在杀死该应用程序。现在全部解决了。

© www.soinside.com 2019 - 2024. All rights reserved.