这就是我正在使用的(在名为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)是回调函数。我无法想象如果我是对的,我应该使用其他方法。
答案 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)
返回相同的内存地址,因此它是同一个物体,它是一个单身人士。