2017-02-20 2 views
0

Я новичок на Свифта, и я пытаюсь использовать закрытие для получения результатов назад от 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.

Я создал закрытие, но я не знаю, как его вернуть. мой вопрос:

  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) 
      } 
     } 

    } 
} 

EDIT: Используйте его в ViewController как этот

MD5Calculator.imageChecksum(imageArray: [imageArray]) { array in 
    // 'array' is your returned result 
} 
+0

, как я могу позвонить на ViewController? – pmb

0

Основная проблема в том, что вы определили закрытие неправильно. В принципе, идея состоит в том, что вы должны определить замыкание с возвращаемым значением, когда вы хотите получить значение внутри, а не снаружи. Использование (в данном случае) было бы примерно таким: let someConstant = onCalculated(). Так вы получаете значение внутри функции.

В вашем случае (вы хотите вернуть значение из функции), закрытие должно быть определено примерно так: onCalculated: @escaping (_ someArray: [String]) -> Void. В этом случае, вы бы просто вернуть значение из функции: onCalculated(someArray)

Использование:

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

P.S. Подумайте о том, чтобы использовать дополнительный разворот для закрытия!

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 

}