我是Swift的新手,我正在尝试使用闭包从viewcontroller获取结果
以下是示例
class MD5Calculator {
static func imageChecksum(imageArray: [UIImage], onCalculated: @escaping () -> [String]){
DispatchQueue.global(qos: .userInitiated).async {
var array: [String] = []
for chosenImage in imageArray {
if let jpegData = UIImageJPEGRepresentation(chosenImage, 80) {
let checksum = jpegData.md5()
let chsum = checksum.toHexString()
array.append(chsum)
}
}
DispatchQueue.main.async {
//return array
}
}
}
}
我想在后台执行md5计算,并在完成时将其传递给viewController。
我创造了封闭但我不知道如何归还它。 我的问题是:
如何使用闭包传递字符串数组
如何在视图控制器中调用ImageChecksum
答案 0 :(得分:0)
主要问题是,您已正确定义了闭包。基本上,我们的想法是,如果要在函数内部 ,而不是外部,则应定义具有返回值的闭包。用法(在本例中)类似于:let someConstant = onCalculated()
。 这是您在函数中获取值的方式。
在你的情况下(你想从函数返回一个值),闭包应该被定义为:onCalculated: @escaping (_ someArray: [String]) -> Void
。在这种情况下,您只需返回函数中的值:onCalculated(someArray)
用法:
MD5Calculator.imageChecksum(
imageArray: inputImageArray,
onCalculated: { someArray in
// enter code here
}
)
P.S。考虑使用可选的unwrap for closures!
答案 1 :(得分:0)
您对封闭的使用无效。您要发回的数组应该是闭包的参数而不是返回类型。
这应该有效
class MD5Calculator {
static func imageChecksum(imageArray: [UIImage], onCalculated: @escaping ([String]) -> ()){
DispatchQueue.global(qos: .userInitiated).async {
var array: [String] = []
for chosenImage in imageArray {
if let jpegData = UIImageJPEGRepresentation(chosenImage, 80) {
let checksum = jpegData.md5()
let chsum = checksum.toHexString()
array.append(chsum)
}
}
DispatchQueue.main.async {
//return array
onCalculated(array)
}
}
}
}
编辑:在您的ViewController中使用它
MD5Calculator.imageChecksum(imageArray: [imageArray]) { array in
// 'array' is your returned result
}
答案 2 :(得分:0)
您应该将结果数组作为闭包参数发送,而不是作为返回值。
如何通过闭包传递字符串数组?
class MD5Calculator {
static func imageChecksum(imageArray: [UIImage], onCalculated: @escaping (_ checksum: [String]) ->()){
DispatchQueue.global(qos: .userInitiated).async {
var array: [String] = []
for chosenImage in imageArray {
if let jpegData = UIImageJPEGRepresentation(chosenImage, 80) {
let checksum = jpegData.md5()
let chsum = checksum.toHexString()
array.append(chsum)
}
}
DispatchQueue.main.async {
//return array
onCalculated(array)
}
}
}
}
2.如何在视图控制器中调用ImageChecksum
MD5Calculator.imageChecksum(imageArray: []) { (checksum) in
}