2017-01-26 3 views
0

Мне нужна ваша помощь с GCD в swift, я только начал использовать этот инструмент, и я немного смущен. Итак, допустим, у меня есть функция foo(), которая снимает фотографию и сохраняет ее в var, внутри этой функции есть еще одна функция, которая проверяет наличие лиц на этой фотографии и возвращает true или false. Затем, когда пользователь нажимает кнопку usePhotoFromPreview будет сохранять фото через пользовательский делегат, когда нет какого-либо лицо на этой фотографии, как это:Задача параллельной обработки изображений с фотографированием в iOS

var image: UIImage? 
var checkingPhotoForFaces: Bool? 

func foo(){ 
let videoConnection = imageOutput?.connection(withMediaType: AVMediaTypeVideo) 
    imageOutput?.captureStillImageAsynchronously(from: videoConnection, completionHandler: { (imageDataSampleBuffer, error) -> Void in 

     if let imageData = AVCaptureStillImageOutput.jpegStillImageNSDataRepresentation(imageDataSampleBuffer) { 
      image = UIImage(data: imageData) 

      self.checkingPhotoForFaces = self.detect(image: image) 
     } 

    }) 

} 

func detect(image: UIImage) -> Bool{ 
..... 
} 

func usePhotoFromPreview(){ 
    self.dismiss(animated: true, completion: { 
     if self.checkingPhotoForFaces == false{ 
      self.delegate?.takenPhoto(photo: self.image!) 
      print("photo taken") 
     }else{ 
      self.delegate?.takenPhoto(photo: nil) 
      print("no photo taken") 
     } 
    }) 
} 

Так что теперь сложная часть, я хотел бы, чтобы обнаружить функцию, чтобы быть выполняется асинхронно и только тогда, когда это выполняется, выполните usePhotoFromPreview. обнаружить func, я полагаю, должен быть на основном потоке из-за реализации CoreImage. Я просто сделал что-то вроде этого:

func foo(){ 
... 
DispatchQueue.global().async { 
       self.checkingPhotoForFaces = self.detect(image: stillImage) 
      } 
... 
} 

, но проблема в том, когда пользователь нажимает слишком быстро на этой кнопке не будет работать, Потому что детектирование FUNC еще обрабатывается, поэтому я думаю, что я нужен какой-то очереди, но я «Смущенный, какой.

кстати. пожалуйста, не цепляйтесь за отсутствия некоторых параметров выше, я пишу это на лету, и это не точка

Спасибо за вашу помощь

+0

Вам нужно добавить параметр закрытия завершения к '' функции обнаружения(), чтобы быть в состоянии ждать, пока это не сделано. – shallowThought

+0

Я понимаю, что это распознавание лиц, но я бы подумал, что на графическом процессоре может (и вообще) работать что-либо, связанное с Core Image. Если да, то разве это не выкинет понятие * основного потока *? – dfd

+0

@shallowThought нормально, но как мне его использовать? –

ответ

0

Изменить обнаруживать, как заметил выше:

func detect(image: UIImage, completion:()->(detectedFaces: Bool)){ 
    //..... 

    completion(true|false) 
} 

Тогда

if let imageData = AVCaptureStillImageOutput.jpegStillImageNSDataRepresentation(imageDataSampleBuffer) { 
     image = UIImage(data: imageData) 

     self.detect(image) { detectedFaces in 
      self.checkingPhotoForFaces = detectedFaces 
      //Enable button? 
     } 
    } 
+0

ok, я бы отметил это как правильно, потому что мне это помогает (я сделал это похоже) –

Смежные вопросы