gpt4 book ai didi

iphone - 令人困惑的闭包和完成句柄

转载 作者:搜寻专家 更新时间:2023-10-31 22:45:54 25 4
gpt4 key购买 nike

我是一名新程序员,很迷茫。

我正在参加这个在线 iOS 开发类(class),我正在配置 Collection View 单元格。但是,使用了闭包和完成句柄,之前从未提及。

import UIKit

class PersonCell: UICollectionViewCell {

@IBOutlet weak var img: UIImageView!

func configureCell(imgUrl: String) {
if let url = NSURL(string: imgUrl) {
downloadImg(url)
}
}

func downloadImg(url: NSURL) {
getDataFromURL(url) { (data, response, error) in
dispatch_async(dispatch_get_main_queue()) { () -> Void in
guard let data = data where error == nil else {return}
self.img.image = UIImage(data: data)
}
}
}

func getDataFromURL(url: NSURL, completion: ((data: NSData?, response: NSURLResponse?, error: NSError?) -> Void)) {

NSURLSession.sharedSession().dataTaskWithURL(url) { (data, response, error) in
completion(data: data, response: response, error: error)
} .resume()

}
}

有人可以向我解释完成处理程序在“getDataFromURL”函数之后做了什么吗?还有闭包在做什么? “(数据,响应,错误)”被传递了吗? swift 如何知道“数据”应该是“(数据,响应,错误)”中的 NSData 等?“dataTaskWithURL”之后的闭包是做什么的(是否设置完成处理程序?

谢谢!

最佳答案

这些都是好问题!

闭包 只是代码行的集合(又名 block ),您可以将其视为变量并像函数一样执行。您可以使用变量名引用闭包,并且可以像任何其他变量一样在函数调用中将闭包作为参数传递,最终在适当的时候执行代码。闭包可以接受某些参数以在其代码中使用,并且可以包含返回值。

例子:

这是一个接受两个字符串作为参数并返回一个字符串的闭包。

let closure: (String, String) -> String = { (a: String, b: String) -> String in
return a + b
}

因此,以下将打印“Hello Jack!”:

print(closure("Hello ", "Jack!"))

闭包也有一个变量类型(就像"hello" 是一个String1 是一个Int)。变量类型基于闭包接受的参数和闭包返回的值。因此,由于上面的闭包接受两个字符串作为参数并返回一个字符串,因此它的变量类型是(String, String) -> String。注意:当没有返回任何内容时(即返回类型为 Void),您可以省略返回类型(因此 (Int, String) -> Void(Int, String)).

完成处理程序 是一个可以传递给某些函数的闭包。当函数完成时,它会执行闭包(例如,当 View 完成动画显示到屏幕上时、文件完成下载时等)。

例子:

“完成!”将在 View Controller 完成呈现时打印。

let newClosure: () -> Void = { () -> Void in
print("Done!")
}
let someViewController = UIViewController(nibName: nil, bundle: nil)
self.presentViewController(someViewController, animated: true, completion: newClosure)

让我们关注您首先编写的 getDataFromURL 函数。它有两个参数:一个类型为 NSData 的变量和一个类型为 (NSData?, NSURLResponse?, NSError?) -> Void 的闭包。因此,闭包(名为 completion)接受三个类型的参数 NSData?NSURLResponse?NSError?,并且不返回任何内容,因为这是您在函数声明中定义闭包的方式。

然后调用 getDataFromURL。如果您阅读 documentation ,您会看到作为第二个参数传递给此函数的闭包在加载任务完成时执行。 dataTaskWithURL 的函数声明定义了闭包接受和返回的变量类型。在这个闭包中,您将调用传递给 getDataFromURL 函数的闭包。

在后一个闭包中(调用 getDataFromURL 时在 downloadImg 中定义的闭包),您正在检查下载的数据是否为 ​​nil,如果没有,则将数据设置为 UIImageView 中的图像。 dispatch_async(dispatch_get_main_queue(), ...) 调用只是确保您根据 Apple 的规范在主线程上设置新图像(您可以在其他地方阅读有关线程的更多信息)。

关于iphone - 令人困惑的闭包和完成句柄,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38236128/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com