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
}
}
}
tableview
在watchKit
中很好地获取了数据,但是,每次应用程序进入后台时,数据都会自动丢失,这很奇怪,因为在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()
如果您采用这种方法,请确保持久保存数据(在收到数据后立即保存,或者在应用即将进入非活动状态时保存)。
我正在使用 (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 应用程序词典有一定的持久性(至少直到被暂停)。
您会推荐什么来解决这个问题并防止数据消失?
您描述的问题是 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()
如果您采用这种方法,请确保持久保存数据(在收到数据后立即保存,或者在应用即将进入非活动状态时保存)。