NSUserDefaults 不使用共享扩展保存到磁盘
NSUserDefaults not saving to disk with sharing extension
我正在尝试将数据保存到 NSUserDefaults 以供以后与共享扩展一起使用。但是,当我重新打开应用程序时,数据永远不会保存。同样,我的扩展无法检索任何数据
我有一个名为 AppUser 的单例 class,它的用户名是 属性。如果我设置
AppUser.username = "Bob"
然后 运行 saveAppData()
class func saveAppData() {
let data = NSKeyedArchiver.archivedDataWithRootObject(AppUser.singleton)
var sharedDefaults = NSUserDefaults(suiteName: "group.ca.mycompany.myapp")
sharedDefaults!.setObject(data, forKey: "AppUser")
sharedDefaults!.synchronize()
}
关闭应用程序并重新打开
class func loadAppData() {
var sharedDefaults = NSUserDefaults(suiteName: "group.ca.mycompany.myapp")
if let data = sharedDefaults!.objectForKey("AppUser") as? NSData {
println("Unarchived file succesfully")
NSKeyedUnarchiver.unarchiveObjectWithData(data) //should throw all the data into the AppUser.singleton class
println("Username is: \(AppUser.singleton.username)")
}
}
当我 运行 loadAppData() 在应用程序重新打开后,我在控制台中得到以下几行:
Unarchived file succesfully
Username is nil
即使我 运行 setObject 并同步,为什么用户名返回为 nil?
注意:我的 "suitName" 在我的应用程序中正确设置为 "group.ca.mycompany.myapp"。我为我的应用程序和扩展程序启用了应用程序组 "group.ca.mycompany.myapp"。
因此,您似乎没有将未归档的 "data" 内容保存到对象中,这是您将未归档的数据内容保存到字符串数组的示例:
let data = NSKeyedArchiver.archivedDataWithRootObject(["asdf", "asdf"])
var sharedDefaults = NSUserDefaults(suiteName: "group.ca.mycompany.myapp")
sharedDefaults!.setObject(data, forKey: "AppUser")
sharedDefaults!.synchronize()
println(sharedDefaults!.valueForKey("AppUser"))
var sharedDefaults1 = NSUserDefaults(suiteName: "group.ca.mycompany.myapp")
if let data = sharedDefaults1!.objectForKey("AppUser") as? NSData {
println("Unarchived file succesfully")
let something = NSKeyedUnarchiver.unarchiveObjectWithData(data) as? [String] //should throw all the data into the AppUser.singleton class
println("Username is: \(something)")
}
这提供了以下信息:
Optional(<62706c69 73743030 d4010203 0405081a 1b542474 6f705824
6f626a65 63747358 24766572 73696f6e 59246172 63686976 6572d106
0754726f 6f748001 a5090a11 12135524 6e756c6c d20b0c0d 0e562463
6c617373 5a4e532e 6f626a65 63747380 04a20f10 80028003 54617364
66546173 6466d214 15161958 24636c61 73736573 5a24636c 6173736e
616d65a2 1718574e 53417272 6179584e 534f626a 65637457 4e534172
72617912 000186a0 5f100f4e 534b6579 65644172 63686976 65720811
161f2832 353a3c42 484d545f 61646668 6d727780 8b8e969f a7ac0000
00000000 01010000 00000000 001c0000 00000000 00000000 00000000 00be>)
Unarchived file succesfully Username is: Optional(["asdf", "asdf"])
这里的区别是我将未归档的内容保存到 "something":
let something = NSKeyedUnarchiver.unarchiveObjectWithData(data) as? [String]
因此,"something" 就像是您的单身人士 class 的代理。
为了使这对您有用,这里有另一个实现:
let data = NSKeyedArchiver.archivedDataWithRootObject(["asdf", "asdf"])
var sharedDefaults = NSUserDefaults(suiteName: "group.ca.mycompany.myapp")
sharedDefaults!.setObject(data, forKey: "AppUser")
sharedDefaults!.synchronize()
var sharedDefaults1 = NSUserDefaults(suiteName: "group.ca.mycompany.myapp")
if let data = sharedDefaults1!.objectForKey("AppUser") as? NSData {
println("Unarchived file succesfully")
let something = NSKeyedUnarchiver.unarchiveObjectWithData(data) as! [String] //should throw all the data into the AppUser.singleton class
println(something[0])
}
这个新的实现打印出这个:
asdf
这意味着您可以将这个未存档的数据保存到一个对象,然后将这个对象轻松地存储到您的 AppUser.singleton,只要您正确设置 AppUser 模型 class。
我正在尝试将数据保存到 NSUserDefaults 以供以后与共享扩展一起使用。但是,当我重新打开应用程序时,数据永远不会保存。同样,我的扩展无法检索任何数据
我有一个名为 AppUser 的单例 class,它的用户名是 属性。如果我设置
AppUser.username = "Bob"
然后 运行 saveAppData()
class func saveAppData() {
let data = NSKeyedArchiver.archivedDataWithRootObject(AppUser.singleton)
var sharedDefaults = NSUserDefaults(suiteName: "group.ca.mycompany.myapp")
sharedDefaults!.setObject(data, forKey: "AppUser")
sharedDefaults!.synchronize()
}
关闭应用程序并重新打开
class func loadAppData() {
var sharedDefaults = NSUserDefaults(suiteName: "group.ca.mycompany.myapp")
if let data = sharedDefaults!.objectForKey("AppUser") as? NSData {
println("Unarchived file succesfully")
NSKeyedUnarchiver.unarchiveObjectWithData(data) //should throw all the data into the AppUser.singleton class
println("Username is: \(AppUser.singleton.username)")
}
}
当我 运行 loadAppData() 在应用程序重新打开后,我在控制台中得到以下几行:
Unarchived file succesfully
Username is nil
即使我 运行 setObject 并同步,为什么用户名返回为 nil?
注意:我的 "suitName" 在我的应用程序中正确设置为 "group.ca.mycompany.myapp"。我为我的应用程序和扩展程序启用了应用程序组 "group.ca.mycompany.myapp"。
因此,您似乎没有将未归档的 "data" 内容保存到对象中,这是您将未归档的数据内容保存到字符串数组的示例:
let data = NSKeyedArchiver.archivedDataWithRootObject(["asdf", "asdf"])
var sharedDefaults = NSUserDefaults(suiteName: "group.ca.mycompany.myapp")
sharedDefaults!.setObject(data, forKey: "AppUser")
sharedDefaults!.synchronize()
println(sharedDefaults!.valueForKey("AppUser"))
var sharedDefaults1 = NSUserDefaults(suiteName: "group.ca.mycompany.myapp")
if let data = sharedDefaults1!.objectForKey("AppUser") as? NSData {
println("Unarchived file succesfully")
let something = NSKeyedUnarchiver.unarchiveObjectWithData(data) as? [String] //should throw all the data into the AppUser.singleton class
println("Username is: \(something)")
}
这提供了以下信息:
Optional(<62706c69 73743030 d4010203 0405081a 1b542474 6f705824 6f626a65 63747358 24766572 73696f6e 59246172 63686976 6572d106 0754726f 6f748001 a5090a11 12135524 6e756c6c d20b0c0d 0e562463 6c617373 5a4e532e 6f626a65 63747380 04a20f10 80028003 54617364 66546173 6466d214 15161958 24636c61 73736573 5a24636c 6173736e 616d65a2 1718574e 53417272 6179584e 534f626a 65637457 4e534172 72617912 000186a0 5f100f4e 534b6579 65644172 63686976 65720811 161f2832 353a3c42 484d545f 61646668 6d727780 8b8e969f a7ac0000 00000000 01010000 00000000 001c0000 00000000 00000000 00000000 00be>)
Unarchived file succesfully Username is: Optional(["asdf", "asdf"])
这里的区别是我将未归档的内容保存到 "something":
let something = NSKeyedUnarchiver.unarchiveObjectWithData(data) as? [String]
因此,"something" 就像是您的单身人士 class 的代理。
为了使这对您有用,这里有另一个实现:
let data = NSKeyedArchiver.archivedDataWithRootObject(["asdf", "asdf"])
var sharedDefaults = NSUserDefaults(suiteName: "group.ca.mycompany.myapp")
sharedDefaults!.setObject(data, forKey: "AppUser")
sharedDefaults!.synchronize()
var sharedDefaults1 = NSUserDefaults(suiteName: "group.ca.mycompany.myapp")
if let data = sharedDefaults1!.objectForKey("AppUser") as? NSData {
println("Unarchived file succesfully")
let something = NSKeyedUnarchiver.unarchiveObjectWithData(data) as! [String] //should throw all the data into the AppUser.singleton class
println(something[0])
}
这个新的实现打印出这个:
asdf
这意味着您可以将这个未存档的数据保存到一个对象,然后将这个对象轻松地存储到您的 AppUser.singleton,只要您正确设置 AppUser 模型 class。