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

标签 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)

        }
    }
}

最佳答案

要理解闭包及其工作原理,必须了解它们只是简单的变量,如 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 协议(protocol)上)并在任务完成时通过闭包通知程序员。这是如何实现的示例:

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

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

关于swift - 回调/闭包如何知道在异步调用完成后等待?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36751068/

相关文章:

java - 在 Java 中使用 UDP 跨网络发送对象

javascript - 返回未定义的 ajax 函数

A 中的 JavaScript : when B inherits from A, 回调看不到 B

swift - 有没有办法在函数中使用通用协议(protocol)作为数据类型?

ios - 用另一个 UIView 替换 UIView,保持约束

初始化之前使用的 Swift 变量

networking - RPC 服务器不可用。 (HRESULT : 0x800706BA) 的异常

ios - Swift - 在显示时将 textField 移动到键盘上

amazon-web-services - 如何从前端容器访问Docker API容器?

javascript - 调用未定义