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() 
  } 
}


}