如何访问 Parse 的 getObjectInBackgroundWithId 块之外的变量值

How to access a variable value outside of Parse's getObjectInBackgroundWithId block

使用以下 Swift 代码,我需要打印 5/hhhh 的值。首先,hhhh 在 "var hhhh:Int = 0" 处设置为零,然后,在 "getObjectInBackgroundWithId" 块内,hhhh 的值通过 "hhhh = appleCount["count"] as!Int" 使用刚刚查询的数据更新来自解析。接下来,我需要以某种方式访问​​ "getObjectInBackgroundWithId" 块之外的 hhhh 的更新值并打印以下值 "print(5/hhhh)",但是,hhhh 的值在此行仍然为零,我正在让 NAN 执行此操作手术。 osteven 好心地给了我一些提示,说明为什么此时 hhhh 的值为零:

但是,我还没有想出一种方法来以某种方式将 hhhh 的更新值传输到 "getObjectInBackgroundWithId" 块之外,并在 "print(5/hhhh)" 处使用该值而不是零。非常感谢任何有关如何实现这一目标的帮助或提示

import UIKit
import Parse
class NewsPageViewController: UIViewController {

override func viewDidLoad() {
super.viewDidLoad(
var hhhh:Int = 0
var tttt:Int = 0
var cccc:Int = 1

if cccc == 1 {
    var query = PFQuery(className: "Count")
    query.getObjectInBackgroundWithId("RhC25gVjZm", block: { (object: PFObject?, error: NSError?) -> Void in
        if error != nil {
            print(error)
        } else if let appleCount = object {
            appleCount["count"] = appleCount["count"] as! Int + 1                
            hhhh = appleCount["count"] as! Int
            appleCount.saveInBackground()
        }
    })
} 
print(5/hhhh)

}

我认为你已经得到的答案很好地解释了这个问题,我会尝试改写这个问题以帮助你理解如何解决它。

getObjectInBackgroundWithId 函数正在 运行在与当前 运行ning print(5/hhhh) 语句不同时间的块。

因此值 'hhhh' 正在更新,但是您正试图在 getObjectInBackgroundWithId 中的块有时间 运行 和更新之前调用 print 语句中的 hhhh 值。

换句话说,

print(5/hhhh)

在执行此代码块之前发生(由于后台线程的性质),

query.getObjectInBackgroundWithId("RhC25gVjZm", block: { (object: PFObject?, error: NSError?) -> Void in
    if error != nil {
        print(error)
    } else if let appleCount = object {
        appleCount["count"] = appleCount["count"] as! Int + 1                
        hhhh = appleCount["count"] as! Int
        appleCount.saveInBackground()
    }
})

一旦您知道 hhhh 变量已更新,一种利用它的方法是创建一个函数来使用(在您的情况下打印)该变量并在块中调用它,如下所示:

示例代码:

func doSomethingWithHHHH(){
  print(5/hhhh)
}

query.getObjectInBackgroundWithId("RhC25gVjZm", block: { (object: PFObject?, error: NSError?) -> Void in
        if error != nil {
            print(error)
        } else if let appleCount = object {
            appleCount["count"] = appleCount["count"] as! Int + 1                
            hhhh = appleCount["count"] as! Int
    //HERE YOU CALL ON THE FUNCTION TO USE THE VARIABLE
            doSomethingWithHHHH()
            appleCount.saveInBackground()
        }
    })

在此示例中,print 语句应该有效,因为在调用函数以使用 'hhhh' 变量之前,变量已在块中更新。

除了 MHomer 的回应之外,我只想补充一点,我的问题的主要部分是因为我试图对我试图在 Parse 中保存的对象进行一些数学运算。因此,我还想到我可以创建一个数组,将我的对象保存在该数组中,然后访问键并更新值。这是我现在正在使用的示例代码。它对保存在 Parse 中的两个不同对象进行一些数学运算,并更新屏幕上的标签文本。为了访问 Parse 中的两个对象并更新它们,我使用了一个数组。

希望这里的答案对将来的人有所帮助,因为 Whosebug 的优秀人员现在正在帮助我。 和平!

var hhhh : [Int] = []
@IBOutlet weak var jPercent: UILabel!

@IBOutlet weak var yPercent: UILabel!

override func viewDidLoad() {
    super.viewDidLoad()

    var query = PFQuery(className: "Count")
    if cccc == 1 {
        query.getObjectInBackgroundWithId("DcU9tdRdnl", block: { (object: PFObject?, error: NSError?) -> Void in
            if error != nil {
                print(error)
            } else if let jCount = object {
                jCount["count"] = jCount["count"] as! Int + 1
                jCount.saveInBackground()

            }
        })
    } else if cccc == 2 {
        query.getObjectInBackgroundWithId("5Bq4HJbFa3", block: { (object: PFObject?, error: NSError?) -> Void in
            if error != nil {
                print(error)
            } else if let yCount = object {
                yCount["count"] = yCount["count"] as! Int + 1
                yCount.saveInBackground()
            }
        })
    }

    //shouldn't use same query for findObjectsInBackgroundWithBlock and getObjectInBackgroundWithId otherwise you'll get a runtime error
    var query2 = PFQuery(className: "Count")
    query2.findObjectsInBackgroundWithBlock { (objects, error) -> Void in
        if let users = objects {
            for object in users {
                if let user = object["count"] as? Int {
                    self.hhhh.append(user)
                }

            }

        }
        var gggg = 100*Float(self.hhhh[0])/(Float(self.hhhh[0]+self.hhhh[1]))
        self.yPercent.text = String(format: "%.1f", gggg) + "%"
        self.jPercent.text = String(format: "%.1f", 100 - gggg) + "%"
        print(self.hhhh[0])
    }
}