我正在尝试优化我的应用程序,因为加载时间似乎很慢。现在我正在制作新闻源。我要做的第一件事是保存一个字典 [followId : followPFUser] 与 id 和对应于该 userId 的 PFUser。由于某些原因,当我运行函数时,它会给我此错误:
Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<_TtGCSs29_NativeDictionaryStorageOwnerSSCSo6PFUser_ 0x13f5a5440> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key 2NWK7vm8cK.'
我认为字典有问题,但我无法弄清楚。这是我的代码:
func updateFollowing(){
if self.followedUsers.count > 0{
print("found some data")
let getPeopleFollowedByUser = PFQuery(className: "Followers")
getPeopleFollowedByUser.whereKey("following", equalTo: (PFUser.currentUser()?.objectId!)!)
getPeopleFollowedByUser.findObjectsInBackgroundWithBlock({ (followingObjects, error) -> Void in
if error == nil {
for followingObject in followingObjects! {
let followed = followingObject.objectForKey("followed") as! String
var duplicate : Bool = false
for (userId, user) in self.followedUsers {
if followed == userId as! String {
duplicate = true
}
}
if (!duplicate){
let followedInfoQuery = PFUser.query()!
followedInfoQuery.getFirstObjectInBackgroundWithBlock({ (user, error ) -> Void in
if error == nil {
if let user = user as? PFUser{
self.followedUsers.setValue(user, forKey: followed)
}
}else{
print(error)
}
NSUserDefaults.standardUserDefaults().setObject(self.followedUsers, forKey: "followedUsers")
})
}
}
}else{
print(error)
}
})
}else{
print("No data saved")
var users : NSDictionary = [String : PFUser]()
if let permanentList = NSUserDefaults.standardUserDefaults().objectForKey("followedUsers") as? [String : PFUser] {
users = permanentList
}
if users.count > 0 {
for (userId, user) in users {
self.followedUsers.setValue(user, forKey: userId as! String)
}
}
let getPeopleFollowedByUser = PFQuery(className: "Followers")
getPeopleFollowedByUser.whereKey("following", equalTo: (PFUser.currentUser()?.objectId!)!)
do{
let followingObjects = try getPeopleFollowedByUser.findObjects()
for followingObject in followingObjects {
let followed = followingObject.objectForKey("followed") as! String
let followedInfoQuery = PFUser.query()!
do{
let user = try followedInfoQuery.getObjectWithId(followed) as! PFUser
print(user)
self.followedUsers.setValue(user, forKey: followed)
}catch let err{
print(err)
}
}
NSUserDefaults.standardUserDefaults().setObject(self.followedUsers, forKey: "followedUsers")
}catch let err{
print(err)
}
}
}
如果您看到可能导致问题的任何内容,请告诉我!谢谢!
编辑:我遵循了调试上的错误,显然它在这一行崩溃:
self.followedUsers.setValue(user, forKey: followed)
我尝试将其更改为self.followedUser[followed] = user
或self.followedUsers.setObject(user, forKey: followed)
但它不会与这两个中的任何一个一起构建。
首先(每@JAL)您错误地设置了字典self.followedUsers
。你应该做self.followedUsers[followed] = user
或self.followedUsers.setObject(user, forKey: followed)
其次,NSUserDefaults
只能存储某些类型的数据。从文档中:
NSUserDefaults 类提供了方便的访问方法 常见类型,如浮点数、双精度数、整数、布尔值和 URL。一个 默认对象必须是属性列表,即 (或 对于集合,实例的组合):NSData,NSString, NSNumber、NSDate、NSArray 或 NSDictionary。如果要存储任何 其他类型的对象,通常应将其存档以创建 NSData 的实例。
因此,您的错误是由于您尝试保存包含Followers
值的字典,该字典不是这些类之一。