Swift队列语法

时间:2015-03-26 07:34:06

标签: ios swift grand-central-dispatch

我正在编写一个从数据库中检索值并在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
}

但事实显然并非如此。

1 个答案:

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


}