如何访问 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])
}
}
使用以下 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])
}
}