2016-04-20 221 views
1

我是Swift新手,對回調/關閉有疑問。在異步網絡調用期間,不同的項目會在不同的時間出現。我想知道一個回調如何知道不會被執行,直到我們從請求中返回的所有內容都被返回?在異步調用完成後,知道如何等待回調/關閉?

編輯:

dispatch_async(dispatch_get_main_queue(), { 
    //Array to store HingeImage objects 
    var myImageArray = Array<HingeImage>() 

    for items in parsedResult { 

     //Create custom objects with values needed 
     let finalObjects = HingeImage(dictionary: items as! [String : AnyObject]) 

     myImageArray.append(finalObjects) 

    } 

    // Callback completion 
    callback(hingeImages: hingeImageArray, error: nil) 
}) 

編輯2:

class SecondViewController: UIViewController { 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     // Do any additional setup after loading the view. 

     callTheCallBackAndGrabData() 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 

    func callTheCallBackAndGrabData() { 

     MainVC.requestWithCallback { (hingeImage, error) in 
      print(hingeImage) 

     } 
    } 
} 
+0

它讀取程序員的頭腦,並做「正確的事情」™ – Avi

+0

閉包不知道..你應該告訴他們什麼時候執行它...... –

+0

可能重複[Swift,從異步塊的返回值](http:///stackoverflow.com/questions/26995757/swift-return-value-from-asynchronous-block) –

回答

6

要理解閉包以及它們是如何工作的一個必須明白,他們只是變量IntString,但他們也有返回值,最常見的是Void。簡而言之,它們允許您將一段代碼封裝到單個變量中,稍後您可以在代碼中調用該變量。

讓我們來看看一個簡單的閉包定義:

let simpleClosure: (Int -> Void) = { 
    intValue in 
    print("Number is \(intValue)") 
} 

你可以看到,關閉是例如像任何IntString,但返回類型,在這種情況下Void()

所有閉包在{ }大括號中定義,首先定義輸入值(本例中爲intValue)。這個intValue將來自閉包定義中的Int參數。讓我們看看我們如何稱此閉包。

simpleClosure(5) 

這將打印如下:

// Number is 5 

這裏發生了什麼事是,數5傳遞給Int閉合參數,你會得到它通過intValue變量如上所述。由於我們正在返回Void,因此我們不需要編寫return語句並關閉完成執行。

現在對於這個問題,閉包在執行時不會自動知道,而是在執行某個任務時被調用。異步網絡調用幾乎相同。您可以同步執行網絡任務(在低級別TCP協議上),並在任務通過關閉完成時通知程序員。這是它可以如何實現的例子:

func networkRequest(url: String, closure: (NSData?,ErrorType?) ->()) { 
    runRequest(url) 
    let response = getServerResponse() 
    closure(response.data, response.error) 
} 

總結起來,這是在執行關閉,並且操作不會自動發生多達程序員來決定。

+0

謝謝你的出色答案。在我上面問的問題中,我添加了代碼。該回調將如何知道何時執行?我很新,所以感謝您的幫助! – SteveSmith

+0

當你調用'callback(hingeImages:hingeImageArray,error:nil)'時,執行閉包。 –

+0

但是,如果我期待的所有項目都沒有在您調用此閉包時返回?由於它是一個異步請求?其他預期項目會發生什麼?在代碼 – SteveSmith