在异步调用完成后,回调/闭包如何知道等待?

Ste*_*ith 1 networking closures callback swift

我是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)
})
Run Code Online (Sandbox Code Playgroud)

编辑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)

        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Sai*_*ira 7

要理解闭包及其工作方式,必须理解它们只是变量为IntString,但它们也具有返回值,最常见Void.简而言之,它们允许您将一段代码包装成单个变量,稍后可以在代码中调用.

我们来看一个简单的闭包定义:

let simpleClosure: (Int -> Void) = {
     intValue in   
     print("Number is \(intValue)")
}
Run Code Online (Sandbox Code Playgroud)

您可以看到闭包是实例,如任何IntString,但在返回类型,在这种情况下Void().

所有闭包都在{ }大括号中定义,首先定义输入值(在本例中为intValue).这intValue将来自Int闭包定义中的参数.让我们看看如何调用这个闭包.

simpleClosure(5)
Run Code Online (Sandbox Code Playgroud)

这将打印如下:

// Number is 5
Run Code Online (Sandbox Code Playgroud)

这里发生的是将数字5传递给Intclosure参数,然后通过intValue变量获取它,如上所述.因为我们正在返回,所以Void我们不需要编写return语句并且闭包完成执行.

现在问题是,闭包在执行时不会自动知道,而是在执行某个任务时调用.异步网络呼叫几乎是一样的.您可以同步执行网络任务(在低级TCP协议上),并在任务通过关闭完成时通知程序员.这是如何实现的示例:

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

总而言之,由程序员决定何时执行闭包并且该操作不会自动发生.