将 NSDictionary 存储在永久内存中 NSUserDefaults 抛出 setValue:forUndefi



我正在尝试优化我的应用程序,因为加载时间似乎很慢。现在我正在制作新闻源。我要做的第一件事是保存一个字典 [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] = userself.followedUsers.setObject(user, forKey: followed)但它不会与这两个中的任何一个一起构建。

首先(每@JAL)您错误地设置了字典self.followedUsers。你应该做self.followedUsers[followed] = userself.followedUsers.setObject(user, forKey: followed)

其次,NSUserDefaults只能存储某些类型的数据。从文档中:

NSUserDefaults 类提供了方便的访问方法 常见类型,如浮点数、双精度数、整数、布尔值和 URL。一个 默认对象必须是属性列表,即 (或 对于集合,实例的组合):NSData,NSString, NSNumber、NSDate、NSArray 或 NSDictionary。如果要存储任何 其他类型的对象,通常应将其存档以创建 NSData 的实例。

因此,您的错误是由于您尝试保存包含Followers值的字典,该字典不是这些类之一。

最新更新