iOS swift解析更新多个对象

时间:2015-07-26 20:35:50

标签: ios swift parse-platform

我有2个对象(父对象,子对象),每个对象有现金和值字段。 按下按钮,它会进行一些计算并将对象字段更新为新值,我可以将父字段更新为新值,但子值保持不变。

下面是完整的代码:

@IBOutlet weak var childImage: UIImageView!

@IBOutlet weak var childInfo: UILabel!
@IBOutlet weak var adoptButton: UIButton!
@IBOutlet weak var nextButton: UIButton!
@IBOutlet weak var malesButton: UIButton!
@IBOutlet weak var femalesButton: UIButton!
@IBOutlet weak var statusLabel: UILabel!

// empty array to load ids from parse
var objectIds = [String]()

// counter is the index number of Ids array
var counter = 0

var childCash = 0
var childValue = 0
var childId: String? = ""
var childName = ""

override func viewDidLoad() {
    super.viewDidLoad()

    // Do any additional setup after loading the view.
    loadingMalesIds()
    childInfo.hidden = true
    adoptButton.hidden = true
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}



@IBAction func maleButtonPressed(sender: AnyObject) {

   loadingMalesIds()
}

@IBAction func femaleButtonPressed(sender: AnyObject) {
    loadingFemalesIds()

}

 @IBAction func nextButtonPressed(sender: AnyObject) {




    counter++

        if (counter <= objectIds.count){
        var query = PFQuery(className:"_User")
        query.getObjectInBackgroundWithId(objectIds[(counter - 1) ] ) {
            (child: PFObject?, error: NSError?) -> Void in
            if error == nil && child != nil {
                 self.childName = child?["username"] as! String
                self.childValue = child?["value"] as! Int
                var status = child?["status"] as! String
                self.childCash = child?["cash"] as! Int
                self.childId =  (child?.objectId)!


                let userImageFile = child?["userImage"] as! PFFile
                userImageFile.getDataInBackgroundWithBlock {
                    (imageData: NSData?, error: NSError?) -> Void in
                    if error == nil {
                        if let imageData = imageData {
                            let image = UIImage(data:imageData)
                            self.childImage.layer.borderWidth = 2
                            self.childImage.layer.masksToBounds = true
                            self.childImage.layer.borderColor = UIColor.whiteColor().CGColor
                            self.childImage.image = image
                        }
                    }
                }

                self.statusLabel.text = status
                self.childInfo.text = "\(self.childName), $\(self.childValue)"
             } else {
                println(error)
            } // end of if error == nil
        }

        }else{
            counter = 0
    } //end of if (counter <= objectIds.count)







    childInfo.hidden = false
    adoptButton.hidden = false

}//end of method

 func loadingMalesIds(){
    objectIds.removeAll(keepCapacity: false)

    var query = PFQuery(className:"_User")

    // get Ids with a condition that users are males
    query.whereKey("gender", equalTo:"male")

    query.findObjectsInBackgroundWithBlock {
        (objects: [AnyObject]?, error: NSError?) -> Void in

        if error == nil {
            // The find succeeded.
             if let objects = objects as? [PFObject] {
                for object in objects {
                    self.objectIds.append((object.objectId)! as String)


                }
            }
        } else {
            // Log details of the failure
            println("Error: \(error!) \(error!.userInfo!)")
        }
    }
    self.malesButton.enabled = false
    self.femalesButton.enabled = true




}
func loadingFemalesIds(){
    objectIds.removeAll(keepCapacity: false)

    var query = PFQuery(className:"_User")

    // get Ids with a condition that users are males
    query.whereKey("gender", equalTo:"female")

    query.findObjectsInBackgroundWithBlock {
        (objects: [AnyObject]?, error: NSError?) -> Void in

        if error == nil {
            // The find succeeded.
            if let objects = objects as? [PFObject] {
                for object in objects {
                    self.objectIds.append((object.objectId)! as String)

                }
            }
        } else {
            // Log details of the failure
            println("Error: \(error!) \(error!.userInfo!)")
        }
    }
    self.malesButton.enabled = true
    self.femalesButton.enabled = false




}

 @IBAction func adoptPressed(sender: AnyObject) {
    // get parent cash and value
    let cash = PFUser.currentUser()!["cash"] as? Int
    let value = PFUser.currentUser()!["value"] as? Int
    let numberOfChildren = PFUser.currentUser()!["numberOfChildren"] as? Int



    //check
    if (cash < childValue){
        noCashAlert()
    }else{

        var parentNewCash = cash! - childValue
        var parentNewValue = value! + childValue

        var childNewCash = childCash + (10 * childValue / 100)

        //number of children 
        var newNumberOfChildren = numberOfChildren! + 1

        // save parent new cash and value
        var queryParent = PFQuery(className:"_User")

        //get parent ID
        var currentUserId = PFUser.currentUser()?.objectId!
        println("current: \(currentUserId)")

        // do the saving operation
        queryParent.getObjectInBackgroundWithId(currentUserId!) {
            (parent: PFObject?, error: NSError?) -> Void in
            if error != nil {
                println(error)
            } else if let parent = parent {

                //parent new cash
                parent["cash"] = parentNewCash
                //parent new value
                parent["value"] = parentNewValue
               //parent number of children

                parent["numberOfChildren"] = newNumberOfChildren

                 parent.saveInBackground()
             }
        }//end parent query


            var queryChild = PFQuery(className:"_User")


            queryChild.getObjectInBackgroundWithId(self.childId!) {
                (child: PFObject?, error: NSError?) -> Void in
                if error != nil {
                    println(error)
                } else if let child = child {
                    child["cash"] = childNewCash

                    child.saveInBackground()
                }
            }//end child query




         }





}

func noCashAlert(){
    let message = "Sorry!, You Don't Have Enough Money,You Can Use Money Printer For Some Extra Cash "
    let okText = "Ok"
    let alert = UIAlertController(title: nil, message: message, preferredStyle: UIAlertControllerStyle.Alert)
    let okayButton = UIAlertAction(title: okText, style: UIAlertActionStyle.Cancel, handler: nil)
    alert.addAction(okayButton)
    self.presentViewController(alert, animated: true, completion: nil)
}

}

1 个答案:

答案 0 :(得分:0)

我们需要更多信息。

一种可能性是childValue被声明为Int,其值小于100,因此childValue / 100为0.记住整数除法与浮点除法。您可以改为Double(childValue) / 100.0来强制浮点。

您是否使用过调试器或调试println()来确定childNewCash是否符合预期?

另一种可能性是将child声明为结构而不是类,但鉴于上下文,这种情况不太可能。

作为次要的风格点,你可能想要:

if let e = error {
   println(e)
}

这样您就不会在输出中获得Optional(...)

这个答案应该已经进入了评论部分,但是现在我会保留它并且只是编辑...如果没有更多的上下文,这是不可能回答的。当你说&#34;它根本没有更新&#34;你在哪里和什么时候看?

如果您在设置现金值后立即查看getObjectInBackgroundWithId完成处理程序,我确定您能够获得正确的价值。

你在寻找云数据库吗?有了背景保存,有一些延迟,你可能看得太早。如果存在冲突的保存,则保存任务可能会相互覆盖。如何使用saveInBackground()的可选完成处理程序来确保您不会过早检查?