遍历 Swift 应用程序中的自定义 Parse 列

Posted

技术标签:

【中文标题】遍历 Swift 应用程序中的自定义 Parse 列【英文标题】:Iterate through a custom Parse column in Swift app 【发布时间】:2015-11-11 03:47:37 【问题描述】:

我想知道如何存储整个自定义列(来自自定义类的用户 Pointer<_User> 列)并将它们全部放入数组变量中,以便我可以查看用户是否存在于该类中.这就是我所拥有的:

旧代码

    var objectUserIdArray = [String]()
    let objectUserIdQuery : PFQuery = PFQuery(className: "Scores")

    objectUserIdQuery.findObjectsInBackgroundWithBlock 
        (objects : [PFObject]? , error : NSError?) -> Void in

        var objectID = objects! as [PFObject]

        for i in 0..<objectID.count 
            objectUserIdArray.append(objectID[i].objectId!)
        

        for _ in objectID 
            print(objectUserIdArray)
        

新代码

func saveScoresOnParse() 
    objectUserIdQuery.whereKey("User", equalTo: PFObject(withoutDataWithClassName: "_User", objectId: userID))

    objectUserIdQuery.findObjectsInBackgroundWithBlock 
        (objects : [PFObject]? , error : NSError?) -> Void in
        if error == nil 

            //var objectID = objects! as [PFObject]

            /*for i in 0..<objectID.count 
                self.objectUserIdArray.append( objectID[i].objectId! )
            */

            for _ in objects! 
                print(objects)
            

            // The score key has been incremented
            for (var i = 0 ; i < self.objectUserIdArray.count ; i++) 
                if self.userID != objects![i] 
                    print("New Scores")
                    print("R: \(self.rightAnswers)")
                    print("W: \(self.wrongAnswers)")
                    print("S: \(self.skippedQuestions)")
                    self.scores["User"] = PFUser.currentUser()
                    self.scores["Right"] = self.rightAnswers
                    self.scores["Wrong"] = self.wrongAnswers
                    self.scores["Skipped"] = self.skippedQuestions
                    self.scores.saveInBackground()

                 else if self.userID == objects![i] 
                    print("Updated Scores")
                    self.scores.incrementKey("Right", byAmount: 1)
                    self.scores.incrementKey("Wrong", byAmount: 1)
                    self.scores.incrementKey("Skipped", byAmount: 1)
                    print("R: \(self.rightAnswers)")
                    print("W: \(self.wrongAnswers)")
                    print("S: \(self.skippedQuestions)")
                    self.scores.saveInBackgroundWithBlock 
                        (success: Bool, error: NSError?) -> Void in
                        if (success) 
                            // The score key has been incremented
                         else 
                            // There was a problem, check error.description
                        
                    

                 else 
                    print("Error")
                
            
         else 
            print(error)
        
    

但它只存储objectId 列而不是Pointer&lt;_User&gt; 列。我知道这一点,因为当我打印里面的东西时,它会打印出 objectIds。

这就是发生的事情,而不是仅仅更新当前用户的分数,它只是产生新的分数。我希望 if 语句检查用户是否已经存在于该列中,如果它确实更新了分数,如果没有,则创建新的。 (新代码的if语句不起作用,我必须把它拿出来保存......)

【问题讨论】:

您要存储什么? PFObject? 我想存储指向用户的整个 objectID。不是在新的自定义类中创建的。就像我想将值存储在第二列或第三列或第四列中。不是整行的 objectID @Paulw11 因此,您只需访问包含用户对象的列。类似objectID[i]["user"].objectId 是的。但是我尝试了这种方法,它给了我一个错误@Paulw11 提供您尝试过的代码和错误信息。您将需要解开可选的并且可能还向下转换。 【参考方案1】:

您更新后的问题更清楚您真正想要做什么;

在 Parse Score 对象中保存或更新用户的分数。为此,没有理由检索任何对象 ID 或遍历任何结果。在使用 Parse 时,您通常不会明确使用 Object Id;您可以简单地通过 Parse 为您计算引用来传递对象本身。

我不确定您究竟想如何更改分数;在您上面的代码中,您在一种情况下递增,但在另一种情况下明确设置分数,但下面的代码显示了一般方法。

如果您经常或重复地更新分数记录,那么您可以通过在第一次找到分数后在属性中保存对分数对象的引用并随后简单地更新并保存它来提高您的代码效率。

func saveScoresOnParse() 
    if let currentUser=PFUser.currentUser() 
       let scoreQuery= PFQuery(className: "Scores")
       scoreQuery.whereKey("User",equalTo:currentUser)
       scoreQuery.getFirstObjectInBackgroundWithBlock 
        (object : PFObject? , error : NSError?) -> Void in
           if error == nil 
              var scoreObject=object ?? PFObject.objectWithClassName("Scores")
              if (scoreObject["User"]==nil) 
                 scoreObject["User"]=currentUser
              
              scoreObject["Right"]=self.rightAnswers
              scoreObject.saveInBackground()
            else 
              print(error)
           
       
     else 
       print("No current user!")
    

【讨论】:

这是我得到的错误:2015-11-11 14:48:05.872 YPWP[65655:4935183] [错误]:指针字段用户需要一个指针值(代码:102,版本:1.9 .0) Optional(Error Domain=Parse Code=102 "pointer field User needs a pointer value" UserInfo=code=102, temporary=0, error=pointer field User needs a pointer value, NSLocalizedDescription=pointer field User need a pointer值) 你从哪里得到这个?查询时还是保存时? 当我在应用程序上按跳过时才会出现错误,所以当它试图保存分数时。 当您将字段设置为对象 ID 而不是对象时会发生该错误。您可以设置断点并单步执行该函数吗?您需要在if error==nil 行上设置第二个断点,以在查询结果闭包内停止

以上是关于遍历 Swift 应用程序中的自定义 Parse 列的主要内容,如果未能解决你的问题,请参考以下文章

Swift 中的自定义地图

Swift 中的自定义 UITableViewCell 注册类

iOS 8 中的自定义振动 - Swift

将 JSON 数据从 Parse Cloud Code 返回到 Swift 中的可解码结构

远程通知中的自定义声音 iOS 10,swift 3

在 Swift 中访问共享容器中的自定义对象