如何使用GCD创建Singleton Serial Queue?

时间:2016-04-27 15:04:47

标签: ios swift grand-central-dispatch

这就是我正在使用的(在名为Utils.swift的类中)

static let serialQueue = dispatch_queue_create("com.wi-mobile.wmForms", DISPATCH_QUEUE_SERIAL)

然而,似乎每当我调用类似

的东西时我都会创建一个新队列
dispatch_async(UtilsUI.serialQueue)

我需要它在另一个类中,因为每次进入ViewController时我都无法实例化一个新队列,我需要它运行。

我需要调度一些网络调用,但我需要在调用第一个调用后立即返回UI,但是我需要所有这些调用才能串行运行。

编辑:

我正在使用回调,也许我的序列化失败了,这是一个例子:

func sendFormToMiddleware() {

    successSending = false
    errorSending = false

    let seconds: String = String(NSDate().timeIntervalSince1970)

    let tbvotos: TbvotosDB = TbvotosDB(survey_id: idForm, transaction_id: "\(WMConfiguration.getTranid())", lu_date: seconds , id_movil: WMConfiguration.getUser(), status: "1")

   dispatch_async(UtilsUI.serialQueue) {
        self.conectionHandler.doPostWmFormsService(self.attemptToSendForm, service: ConnectionHandler.Service.TBVOTOS, parameters: tbvotos.asArray()!)
    }
}

func attemptToSendForm(isOk: Bool, mData: [AnyObject], isLastEntity: Bool) -> Void {
    if isOk {
        successSending = true
        Queries.unifyTransactionIDForCurrentFormQuestions(idForm, tranId: WMConfiguration.getTranid())
        let responses = Queries.getResponses(idForm)

        dispatch_async(UtilsUI.serialQueue) {
            self.conectionHandler.insertRespuestas(self.callbackEnvioRespuestas, responses: responses)
        }

        self.removeAllOverlays()
        self.returnAfterSendingForm()
        self.view.userInteractionEnabled = true
        self.navigationController?.navigationBar.userInteractionEnabled = true
    } else {
        self.removeAllOverlays()
        self.view.userInteractionEnabled = true
        self.navigationController?.navigationBar.userInteractionEnabled = true
        errorSending = true
        UtilsUI.showAlert(NSLocalizedString("Error al contactar con el Servidor", comment: "Fallo conexión middleware"), self)
    }
}

这里doPostWmFormsService的第一个参数(attemptToSendForm)是回调函数。我无法想象如果我是对的,我应该使用其他方法。

3 个答案:

答案 0 :(得分:1)

它需要在一个单例上保持相同的队列,你可以使用AppDelegate,如果它是一个简单的1队列或者制作一个专用的单例。

在您的应用上代表:

static let serialQueue = dispatch_queue_create("com.wi-mobile.wmForms", DISPATCH_QUEUE_SERIAL)

然后得到它

  if let appDel = UIApplication.sharedApplication().delegate as? AppDelegate {
     dispatch_async(appDel.serialQueue)
  }

答案 1 :(得分:0)

我不确定如何在swift中编写代码,但是根据我的目标c背景,我建议你使用 dispatch_once ,比如创建一个函数,你可以在你的队列中初始化,然后将其返回给调用者:

{
  var singleton:serialQueue 
  dispatch_once_t onceToken 
  dispatch_once(&onceToken,{ in singleton = ...

  return singleton;
}

然后使用单身

这将创建一个对象,只有一个,并在每次调用函数时返回它...

答案 2 :(得分:0)

这个问题超出了评论的范围,因为它最初是如何在Swift中创建单例队列的,我必须赞扬Phillip Mills打印它两次print(UtilsUI.serialQueue)返回相同的内存地址,因此它是同一个物体,它是一个单身人士。