2015-05-08 140 views
7

我對Swift和Xcode一般都比較陌生,並且在嘗試解決這個問題時發現了很多困難。僅在異步函數完成後才運行代碼

我正在開發一個應用程序,利用Parse.com後端服務器。爲了不阻塞主線程,每當應用程序從服務器下載任何東西時,它都會在異步線程上異步完成。然而,其餘的代碼繼續在主線程上執行,並且它應該從服務器獲得的數據尚未下載時崩潰。我想知道如何在異步函數完成後調用函數來運行,而這必須在單獨文件中的函數中完成。

我看到閉包可能對此有所幫助,但是我發現語法非常困難,並且我將非常感謝您的解釋。但任何方式都會非常有幫助。

感謝

回答

13

嗯,你只需調用函數在異步回調結束。那就是當異步回調已經結束的時候 - 當異步回調的其他部分完成時!因此,舉例來說:

func myMethod() { 
    // ... code ... 
    somebody.doSomethingWith(someObject, asynchronousCallback: { 
     (thing, otherThing) in 
     // ... do whatever 
     // --> CALL THE FUNCTION! 
    }) 
    // ... code ... 
} 

如果問題是,你不知道調用什麼功能,你可以配置你周圍的功能/對象,以便有人能你的函數,而那什麼你在上面說的「調用函數」的地方打電話。

例如:

func myMethod(f:() ->()) { // we receive the function as parameter 
    // ... code ... 
    somebody.doSomethingWith(someObject, asynchronousCallback: { 
     (thing, otherThing) in 
     // ... do whatever 
     // --> CALL THE FUNCTION, by saying: 
     f() 
    }) 
    // ... code ... 
} 
+0

你能解釋一下如何交出功能?我事先明白,你運行函數的地方是你寫的「調用函數」,但函數,就像我說的,是在不同的文件中。我現在正在處理的具體情況是我編寫了一個函數,它首先檢查被查找的對象是否在本地數據存儲區中,如果沒有,則檢查服務器。因爲我希望它能在任何地方運行,所以我把它放在一個單獨的文件中。但是我仍然需要它在調用它的類中調用函數。再次感謝。 – Acoop

+0

我當然可以解釋它_linguistically_。在Swift中,函數是一等公民,因此函數A可以將函數B傳遞給函數C,函數C可以存儲函數B.然後,函數C或其他訪問存儲函數B的函數可以調用函數B.這就是所有的回調工作。當你說'UIView.animateWithDuration(){...}'時,這就是你要交給Cocoa的一個函數 - 它將調用的函數來執行動畫。另請參閱我的書:http://www.apeth.com/swiftBook/ch02.html#_function_as_value – matt

+0

但是,您如何選擇_architecturally_取決於您。在上面的例子中,'myMethod'可能需要一個函數作爲參數;然後在「調用函數」中,您調用它。但還有很多其他可能的情況。看到這個示例代碼的例子:https://github.com/mattneub/Programming-iOS-Book-Examples/blob/master/bk2ch24p842downloader/ch37p1099downloader/MyDownloader.swift – matt

3

擴展在馬特的回答,您可以myMethod的,需要一個閉合作爲參數的方法:

​func​ ​myMethod​(​completionBlock​: (result: String) ->()) 
{ 
    // ... code ... 
    somebody.doSomethingWith(someObject, asynchronousCallback: { 
     (thing, otherThing) in 
     // ... do whatever 
     completionBlock(thing) 
    }) 
    // ... code ... 
} 
相關問題