在 Swift 中与 mongoDB 和 Parse 联合

Posted

技术标签:

【中文标题】在 Swift 中与 mongoDB 和 Parse 联合【英文标题】:Jointure with mongoDB and Parse in Swift 【发布时间】:2017-07-11 16:00:08 【问题描述】:

我正在尝试在 mongoDB 上创建“用户”和“评论”之间的连接,以便在我的应用上安装 cmets。

这是我的代码:

let query = PFQuery(className: "comments")
     query.whereKey("to", equalTo: commentuuid.last!)
     query.skip = count - self.page
     query.addAscendingOrder("createdAt")
     query.findObjectsInBackground(block:  (objects: [PFObject]?, error: Error?) in

        if error == nil 
           // Clean up
           self.usernameArray.removeAll(keepingCapacity: false)
           self.avaArray.removeAll(keepingCapacity: false)
           self.commentArray.removeAll(keepingCapacity: false)
           self.dateArray.removeAll(keepingCapacity: false)

           // find related objects
           for object in objects! 

               let infoQuery = PFQuery(className: "_User")
              infoQuery.getObjectInBackground(withId: object.object(forKey: "id") as! String, block:  (test: PFObject?, error: Error?) in
                 if error == nil 
                    print("YES")
                    self.usernameArray.append(test!.object(forKey: "username") as! String)

                  else 
                    print(error!.localizedDescription)
                 
              )

              self.commentArray.append(object.object(forKey: "comment") as! String)
              self.dateArray.append(object.createdAt)
              self.tableView.reloadData()

              // Scroll to bottom
              self.tableView.scrollToRow(at: IndexPath(row: self.commentArray.count - 1, section: 0), at: .bottom, animated: true)
           

         else 
           print(error!.localizedDescription)
        


     )

这些行执行得很好:

self.commentArray.append(object.object(forKey: "comment") as! String)
              self.dateArray.append(object.createdAt)

但那个不是:

let infoQuery = PFQuery(className: "_User")
              infoQuery.getObjectInBackground(withId: object.object(forKey: "id") as! String, block:  (test: PFObject?, error: Error?) in
                 if error == nil 
                    print("YES")
                    self.usernameArray.append(test!.object(forKey: "username") as! String)

                  else 
                    print(error!.localizedDescription)
                 
              )

我尝试在 cellForRowAt 函数中打印 usernameArray 和 dateArray(只是为了看看区别)。

当我启动视图时,usernameArray 是空的,而 dateArray 不是。如果我稍微滚动一下,usernameArray 就会被填充(但我需要滚动才能填充数组,这是不可接受的)。

【问题讨论】:

【参考方案1】:

可能是因为您在检索数据之前调用了 UI 相关方法:

          self.commentArray.append(object.object(forKey: "comment") as! String)
          self.dateArray.append(object.createdAt)

          let infoQuery = PFUser.query()!
          infoQuery.getObjectInBackground(withId: object.object(forKey: "id") as! String, block:  (test: PFObject?, error: Error?) in
             if error == nil 
                print("YES")
                self.usernameArray.append(test!.object(forKey: "username") as! String)

              else 
                print(error!.localizedDescription)
             

              // These two methods were the issue.
              self.tableView.reloadData()
              // Scroll to bottom
              self.tableView.scrollToRow(at: IndexPath(row: self.commentArray.count - 1, section: 0), at: .bottom, animated: true)

          )

您应该考虑:

使用子分类PFObject 避免访问可能因拼写错误而导致错误的原始字典。 将关键字 object 替换为更好的关键字(根据您的上下文,comment

【讨论】:

以上是关于在 Swift 中与 mongoDB 和 Parse 联合的主要内容,如果未能解决你的问题,请参考以下文章

在 Swift 中与 UIActivityViewController 共享字典

在 mongodb 中,如何仅选择文档中与 find() 条件匹配的对象?

MongoDB 中与 Ruby 一起使用的字符串数据类型的最大长度是多少?

如何在 iOS Swift 中与 UIActivityViewController 共享的 WhatsApp 中设置不同的参数?

如何准备 API 响应以在 swift 中与 jsonDecoder 一起使用

如何在 iOS 上将“MongoDB 日期时间(ISO 日期)”解析为 NSDate(swift 和 Objective-c)