Swift 队列语法
Swift queues syntax
我正在编写一个从数据库中检索值并将其显示在 UI 上的程序。检索步骤异步执行,因此结果框在数据库结果返回之前得到更新。现在我可以通过在 "ResultBox.text = globaldbresults" 上方使用 NSThread.sleepForTimeInterval(time) 来让它工作,但我知道这是一个不好的方法,因为检索时间会根据检索的大小而有所不同等。我更愿意确保块(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()
}
}
我刚刚放了相关的代码行。 globaldbresults 是处理我的问题之一的糟糕方法,解决了如果我尝试直接从我的 goClicked 操作中引用 dbresults 时发生的范围问题。
我认为应该是:
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
}
但显然不是这样
如果您只有一个获取所需数据的请求,这可以通过一个简单的回调闭包来解决。
但是如果你想用 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()
}
}
}
我正在编写一个从数据库中检索值并将其显示在 UI 上的程序。检索步骤异步执行,因此结果框在数据库结果返回之前得到更新。现在我可以通过在 "ResultBox.text = globaldbresults" 上方使用 NSThread.sleepForTimeInterval(time) 来让它工作,但我知道这是一个不好的方法,因为检索时间会根据检索的大小而有所不同等。我更愿意确保块(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()
}
}
我刚刚放了相关的代码行。 globaldbresults 是处理我的问题之一的糟糕方法,解决了如果我尝试直接从我的 goClicked 操作中引用 dbresults 时发生的范围问题。
我认为应该是:
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
}
但显然不是这样
如果您只有一个获取所需数据的请求,这可以通过一个简单的回调闭包来解决。
但是如果你想用 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()
}
}
}