我正在编写一个从数据库中检索值并在UI上显示它的程序。检索步骤以异步方式执行,因此结果框在db结果返回之前得到更新。现在我可以通过使用" ResultBox.text = globaldbresults"上面的NSThread.sleepForTimeInterval(时间)来使它工作。但我知道这是一个不好的方法,因为检索时间会根据检索的大小等而有所不同。我更喜欢确保一个块(UI文本域更新)仅在检索完成后运行。
我已经尝试过使用dispatch_group_wait,但我认为我错了。
[In AppDelegate.swift]
var globaldbresults
@UIApplicationMain
[END In Appdelegate.swift]
import UIKit
import Dispatch
class ViewController: UIViewController {
dbGetqueue = dispatch_group_create()
@IBAction func goClicked(sender: AnyObject) {
dispatch_group_enter(dbGetqueue)
mysqlget(Room1num, num2: Room2num)
dispatch_group_leave(dbGetqueue)
dispatch_group_wait(dbGetqueue, 5)
ResultBox.text = globaldbresults
}
func mysqlget(num1 :Int, num2 :Int) {
let myUrl = NSURL(string: "http://localhost/iOS_PHP_MySQL.php")
let myGetTask = NSURLSession.sharedSession().dataTaskWithRequest(myRequest, completionHandler: {(reqData, reqResponse, reqError) -> Void in
dbresults = (NSString(data: reqData, encoding: NSUTF8StringEncoding)!)
globaldbresults = String(dbresults)
})
myGetTask.resume()
}
}
我只是放了相关的代码行。如果我尝试直接从我的goClicked Action引用dbresults,那么处理我的一个问题的糟糕方法的globaldbresults解决了范围问题。
我应该是:
dispatch_group(dbGetqueue) {
block to execute
}
[Some other code not dependent on block above]
dispatch_group_wait(dbGetqueue) {
code that doesn't start till dbGetqueue finished
}
但事实显然并非如此。
答案 0 :(得分:0)
如果您只有一个请求来获取所需数据,则可以通过简单的回调闭包来解决。
但是如果你想在这里用dispatch_group_方式来做,那就可以了:
class ViewController: UIViewController {
dbGetqueue = dispatch_group_create()
@IBAction func goClicked(sender: AnyObject) {
mysqlget(Room1num, num2: Room2num)
dispatch_group_notify(dbGetqueue,dispatch_get_main_queue(),{
self.ResultBox.text = globaldbresults
})
}
func mysqlget(num1 :Int, num2 :Int) {
dispatch_group_enter(dbGetqueue) //Enter group here
let myUrl = NSURL(string: "http://localhost/iOS_PHP_MySQL.php")
let myGetTask = NSURLSession.sharedSession().dataTaskWithRequest(myRequest, completionHandler: {(reqData, reqResponse, reqError) -> Void in
dbresults = (NSString(data: reqData, encoding: NSUTF8StringEncoding)!)
globaldbresults = String(dbresults)
dispatch_group_leave(self.dbGetqueue) //Leave group when you are done getting results.
})
myGetTask.resume()
}
没有dispatch_group_的另一种方法是
class ViewController: UIViewController {
dbGetqueue = dispatch_group_create()
@IBAction func goClicked(sender: AnyObject) {
mysqlget(Room1num, num2: Room2num)
}
func mysqlget(num1 :Int, num2 :Int) {
let myUrl = NSURL(string: "http://localhost/iOS_PHP_MySQL.php")
let myGetTask = NSURLSession.sharedSession().dataTaskWithRequest(myRequest, completionHandler: {(reqData, reqResponse, reqError) -> Void in
dbresults = (NSString(data: reqData, encoding: NSUTF8StringEncoding)!)
globaldbresults = String(dbresults)
dispatch_async(dispatch_get_main_queue(), {
self.self.ResultBox.text = globaldbresults
})
})
myGetTask.resume()
}
}
}