1

我需要進行異步調用,以便第二個方法只在第一個方法完成後調用。兩種方法都是網絡調用。事情是這樣的:Asynchronous swift 3

signIn() 
getContacts() 

我想確保getContacts完成簽到後,只有被調用。 FWIW,我無法編輯方法簽名,因爲它們來自Google SDK。

這是我的嘗試:

let queue = DispatchQueue(label: "com.app.queue") 

queue.async { 
signIn() 
getContacts() 

} 
+1

好。什麼是真正的問題? – JeremyP

+0

通常,方法(例如'signIn')會傳入一個方法結束後調用的閉包,例如:'signIn(){getContacts()}',儘管此方法必須重新設計。 – Robert

回答

1

異步調用按其本質不會運行完成,然後調用下一個事件。他們在被要求完成的任務甚至已經安排好之前立即返回。

您需要一些方法讓第二個任務等待第一個任務完成。

NauralInOva給出了一個很好的解決方案:使用一對NSOprations並使它們相互依賴。你也可以把2個操作放入一個串行隊列中,第二個操作直到第一個完成纔會開始。

但是,如果這些調用另一個線程上觸發異步操作,他們可能仍然會返回與操作隊列可以觸發第二操作(getContacts()呼叫,而無需等待signIn()完成。

另一種選擇是設置了第一個功能,採取回調:

signIn(callback: { 
    getContacts() 
} 

第三種選擇是設計一個登錄對象,需要一個代表,以及登錄對象將呼籲委託一個signInComplete方法一旦簽到完成

這是一個很常見的事情,大多數網絡API都是爲「開箱即用」而構建的。如果Google API沒有處理這個功能的設施,我會感到震驚的。

您使用的是哪種Google框架?你能指出它的文檔嗎?

+0

你是對的,我不知道我是怎麼錯過的。他們確實有一個didSignIn方法,在登錄完成後調用,我只需要將getContacts方法放在那裏,它現在工作正常。感謝您的幫助。 –

1

您正在尋找的NSOperation。您可以使用NSOperation使用依賴關係將操作鏈接在一起。一旦一個操作完成,它可以將其完成塊傳遞給下一個操作。你的用例的一個例子可能是:

// AuthOperation is a subclass of NSOperation 
let signInOperation = AuthOperation() 
// ContactsOperation is a subclass of NSOperation 
let getContactsOperation = ContactsOperation() 

getContactsOperation.addDependency(signInOperation) 

Ray Wenderlich有一個很好的教程涵蓋NSOperation。本教程使用下載操作異步加載圖像,並在完成網絡請求時依賴項將過濾照片。

Apple還有一個很棒的sample project,它使用異步網絡請求的操作。

+0

謝謝,這是一個很好的閱讀。不是我所需要的,但可能是我實際問題的最佳答案。 –