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

时间:2016-03-13 08:25:40

标签: ios swift watchkit apple-watch watch-os-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")
    }
}

观看应用内部:

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     
        }
    }
}

数据由tableview中的watchKit很好地提取,然而,每次应用程序进入后台时,数据都会自动丢失,这很奇怪,因为在iPhone应用程序中,词典有一些持久性(至少在被暂停之前)。

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

1 个答案:

答案 0 :(得分:5)

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

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

如果您的字典为空白,则可以使用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()

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