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

时间:2016-04-20 17:30:05

标签: swift networking callback closures

我是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)

        }
    }
}

1 个答案:

答案 0 :(得分:7)

要了解闭包及其工作方式,必须了解它们只是变量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)
}

总结起来,由程序员决定何时执行闭包并且该操作不会自动发生。