WatchKit应用程序在运行背景后丢失数据 - Swift

Dav*_*son 2 ios swift apple-watch watchkit watchos-2

我正在使用(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")
    }
}
Run Code Online (Sandbox Code Playgroud)

在手表应用内:

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     
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

该数据由提取tableviewwatchKit很好,但是,每个应用程序进行到背景时,数据自动丢失,这很奇怪,因为在iPhone应用字典有一些持久性(至少直到变得悬浮).

您建议如何解决此问题并防止数据消失?

小智 5

您所描述的问题是,一旦您返回监视应用程序,该表不会显示任何数据.虽然您没有显示该特定代码,但可能是由于下次打开应用程序时字典为空白.

由于应用程序上下文仅被接收一次,因此您可能用于重新加载表的任何属性观察者或方法只会在数据新到达时触发,而不会在应用程序恢复时触发.

当您的字典为空白时,您可以返回该receivedApplicationContext属性以访问最近收到的表格数据.

包含从配对和活动设备接收的最后更新数据的字典.(只读)

使用此方法可以访问最近收到的更新字典.会话对象还将新到达的字典发送到会话:didReceiveApplicationContext:其委托的方法.

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()
Run Code Online (Sandbox Code Playgroud)

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