Swift中将Parse的[PFObject]数组添加到字典为空问题求助
解决Parse PFObject数组转字典后为空的问题
我猜你这会儿肯定有点头疼——明明已经从Parse拿到了PFObject数组,结果往字典里塞完却发现是空的。别着急,咱们一步步捋清楚问题出在哪:
首先看你给出的代码片段,循环那里就有个小坑:你写的for posts in unwrappedPosts,外层已经有个叫posts的数组变量了,循环里又用同名变量指代单个元素,这会导致变量名冲突,后续的属性访问大概率会出问题。先把这个改了,比如改成for post in unwrappedPosts。
另外,空字典最常见的原因还是循环内部的赋值逻辑没写对,或者没正确处理PFObject的属性访问,再或者是异步闭包的作用域问题。我给你整理了完整的修正方案和常见场景:
场景1:按属性分组存储PFObject
假设你想把查询到的帖子按category属性分组存入字典,正确的代码应该是这样:
var postDictionary = [String:[AnyObject]]() query.findObjectsInBackground(block: { (posts: [PFObject]?, error: Error?) in if let unwrappedPosts = posts, error == nil { // 修正循环变量名,避免和外层数组冲突 for post in unwrappedPosts { // 从PFObject中提取属性,必须用object(forKey:),还要处理可选值 guard let category = post.object(forKey: "category") as? String else { continue // 如果当前帖子没有分类,直接跳过 } // 给字典赋值:已有分类就追加,没有就新建数组 if var existingPosts = postDictionary[category] { existingPosts.append(post) postDictionary[category] = existingPosts } else { postDictionary[category] = [post] } } // 一定要在闭包内部打印/使用字典!因为findObjectsInBackground是异步的 print("字典有效计数:\(postDictionary.count)") } else { print("查询失败:\(error?.localizedDescription ?? "未知错误")") } })
场景2:直接用PFObject的objectId作为键
如果只是想把每个PFObject用它的objectId作为键存起来,代码可以简化成:
var postDictionary = [String:PFObject]() query.findObjectsInBackground(block: { (posts: [PFObject]?, error: Error?) in if let unwrappedPosts = posts, error == nil { for post in unwrappedPosts { guard let postId = post.objectId else { continue } postDictionary[postId] = post } print("字典计数:\(postDictionary.count)") } })
容易踩的另一个坑:异步闭包的作用域
如果你在闭包外部直接打印postDictionary.count,那肯定是0——因为findObjectsInBackground是异步执行的,闭包还没跑完,字典还没被填充。所有需要用到这个字典的逻辑,都必须放在闭包内部(赋值完成之后)。
额外小技巧:用PFObject子类简化代码
如果你的项目里经常用到Post这类对象,建议给PFObject创建子类,这样就能用点语法直接访问属性,代码会清爽很多:
class Post: PFObject, PFSubclassing { @NSManaged var category: String? @NSManaged var content: String? static func parseClassName() -> String { return "Post" // 对应Parse后台的表名 } }
之后查询时就能直接用[Post]类型,循环里直接写post.category,不用再写object(forKey:)了。
内容的提问来源于stack exchange,提问作者Iam Wayne
相关产品推荐
相关产品推荐

