2016-04-27 48 views
1

這是我在用如何用GCD創建Singleton串行隊列?

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

但是(稱爲Utils.swift一個類的內部),好像我創建一個新的隊列,每次我打電話類似

dispatch_async(UtilsUI.serialQueue) 

我需要它在另一個類中,因爲我不能在每次進入ViewController時都實例化一個新的隊列,我需要它運行。

我需要調度一些網絡調用,但我需要在調用第一個UI後立即返回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)是回調函數。如果我是對的,我無法確定我應該使用其他方法。

+2

爲什麼你認爲你會得到一個新的隊列?如果我把你的代碼行放在一個類中,然後「打印(UtilsUI.serialQueue)」兩次,它會同時顯示相同的地址(因此是同一個對象)。 –

+0

我想我得到一個新的隊列,因爲在看完日誌請求後,它們不會連續運行 – danywarner

+0

打印您從'serialQueue'返回的值是肯定的。有可能(可能嗎?)您的請求被串行調度,但是網絡本身沒有被序列化。也許用你發送的代碼的例子更新你的問題.... –

回答

0

問題出去的範圍中的註釋,是它最初如何在Swift中創建一個單例隊列,我必須稱讚Phillip Mills打印兩次。print(UtilsUI.serialQueue)返回相同的內存地址,因此它是同一個對象,它是一個單例。

1

它需要在一個單例中持久化相同的隊列,如果它的1隊列簡單的事情,或者使一個專用的單例,你可以使用AppDelegate。

在您的應用程序代理:

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

我不知道如何將它在SWIFT代碼,但是從我的目標C的背景,我建議你使用dispatch_once,類似於創建一個函數,您可以在其中初始化一個隊列,然後將其返回給主叫方:

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

    return singleton; 
} 

然後用單

這將創建一個對象,只有一個,每次ü調用該函數返回它...

+0

可能swift代碼不是100%正確的,但我希望你明白... –