WatchKit 应用在进入后台后丢失数据 - Swift

WatchKit app losing data after going background - Swift

我正在使用 (watchOS 2) applicationContext 方法将字典从我的 iPhone 传递到手表。

在 iPhone 应用内:

func giveMeInfo(){
    var lastStringUsed = porkee288.storyPoints.last!
    do {
        let resultDict = ["dict": myDict]
        try WCSession.defaultSession().updateApplicationContext(resultDict)
    }  
    catch {
        print("Something wrong happened")
    }
}

手表应用内:

func session(session: WCSession, didReceiveApplicationContext applicationContext: [String : AnyObject]) {

    dispatch_async(dispatch_get_main_queue()) { () -> Void in

        if let retrievedDict = applicationContext["dict"] as? [String : String] {

                self.dictInsideWatch = retrievedDict     
        }
    }
}

tableviewwatchKit中很好地获取了数据,但是,每次应用程序进入后台时,数据都会自动丢失,这很奇怪,因为在iPhone 应用程序词典有一定的持久性(至少直到被暂停)。

您会推荐什么来解决这个问题并防止数据消失?

您描述的问题是 table 在您 return 到手表应用程序后不显示任何数据。虽然您没有显示该特定代码,但很可能是因为下次打开该应用程序时字典为空。

由于应用程序上下文只收到一次,任何 属性 观察者或您可能用来重新加载 table 的方法只会在数据新到达时触发,不是当应用程序恢复时。

当您的词典为空时,您可以返回 receivedApplicationContext 属性 来访问您的 table.

最近收到的数据

A dictionary containing the last update data received from a paired and active device. (read-only)

Use this method to access the most recently received update dictionary. The session object also sends a newly arrived dictionary to the session:didReceiveApplicationContext: method of its delegate.

您还可以将字典保留在 NSUserDefaults 中,以处理您的应用在挂起时被终止的情况。

您没有显示您在获得数据后如何调用 loadTable()。一旦您(接收到新数据或)检索到持久数据,您肯定想这样做。

if !session.receivedApplicationContext.keys.isEmpty {
    // Use most recently received dictionary
    dictInsideWatch = receivedApplicationContext["dict"]
} else {
    // Use persisted dictionary
    dictInsideWatch = NSUserDefaults.standardUserDefaults().dictionaryForKey("dict") ?? [:]
}
loadTable()

如果您采用这种方法,请确保持久保存数据(在收到数据后立即保存,或者在应用即将进入非活动状态时保存)。