2017-02-20 48 views
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 
      } 
     } 

    } 
} 

我想在後臺MD5計算做例子,當它完成傳遞給viewController。

我創建了閉包,但我不知道如何返回它。 我的問題是:

  1. 如何通過字符串數組與封閉

  2. 如何調用ImageChecksum在視圖控制器

回答

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 
} 
+0

我怎麼呼籲視圖 - 控制? – pmb

0

的主要問題是,您已經定義不正確關閉。基本上,這個想法是,你應該定義一個帶有返回值的閉包,當你想得到值內部功能,而不是外部。用法(在這種情況下)將如下所示:let someConstant = onCalculated()這是您獲取函數內部值的方式。

在你的情況下(你想從函數返回一個值),閉包應該定義如下:onCalculated: @escaping (_ someArray: [String]) -> Void。在這種情況下,你只需從函數返回值:onCalculated(someArray)

用法:

MD5Calculator.imageChecksum(
    imageArray: inputImageArray, 
    onCalculated: { someArray in 
     // enter code here 
    } 
) 

附:考慮使用可選的unwrap進行關閉!

0

你應該把你的結果數組作爲閉包的參數,而不是返回值。

  1. 如何傳遞字符串數組與閉包?

    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.How調用ImageChecksum在視圖控制器

MD5Calculator.imageChecksum(imageArray: []) { (checksum) in 

}