【问题标题】:How does a callback/closure know to wait after Asynchronous call is finished? [closed]异步调用完成后,回调/闭包如何知道等待? [关闭]
【发布时间】:2016-08-13 13:27:35
【问题描述】:

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

        }
    }
}

【问题讨论】:

标签: swift networking callback closures


【解决方案1】:

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

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

【讨论】:

  • 感谢您的出色回答。在我上面提出的问题中,我添加了代码。该回调如何知道何时执行?我对此很陌生,所以感谢您的帮助!
  • 在你调用callback(hingeImages: hingeImageArray, error: nil)的那一刻,闭包就被执行了。
  • 但是,如果我期望返回的所有项目在您调用此关闭时都没有返回怎么办?因为它是一个异步请求?其余的预期项目会发生什么?在代码中检查上面的 EDIT 2
  • 然后你需要在网络请求闭包里面调用闭包,让它们看起来是嵌套的。您可以在任何其他闭包内多次调用闭包,从而达到您想要的结果。
  • 你能给我看一个代码示例吗?我真的很想学习这个!
猜你喜欢
  • 1970-01-01
  • 2021-11-13
  • 2022-11-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多