2016-04-20 222 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