我有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)
}
}
答案 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()
的可选完成处理程序来确保您不会过早检查?