0

Я создаю приложение для фильтрации изображений, в основном у вас есть изображение, отображаемое на контроллере представления, и несколько различных фильтров изображения внизу; нажатие на один будет влиять на яркость основного изображения (например). Я заметил, что применение фильтра занимает больше времени на изображениях с более высоким разрешением, поэтому я думал о создании обработчика завершения (это первый раз, когда я делаю это завершение) и отображать «индикатор индикатора активности» в центре диспетчера представлений для уведомления пользователь, который его работы ... так что ниже является функ (в классе ImageProcessor.swift), который изменяет яркость изображения и отправить обратно CIImage на вид контроллера:Отображение/скрытие индикатора активности в обработчике завершения

func setBrightness(ciImage: CIImage, intensity: Float = 0.5, completion: (CIImage) -> CIImage) -> CIImage? { 
    let filter = CIFilter(name: "CIColorControls"); 
    filter?.setValue(ciImage, forKey: kCIInputImageKey); 
    filter?.setValue(intensity, forKey: "inputBrightness"); 
    return completion((filter?.outputImage)!); 
} 

то это, как его называют от ViewController:

case .Brightness: 
     self.loader.startAnimating(); 
     imgViewFiltered.image = processor.getUIImage(processor.setBrightness(CIImage(image: imgViewFiltered.image!)!, completion: { (let ci) -> CIImage in 
      dispatch_async(dispatch_get_main_queue()) { 
       self.loader.stopAnimating(); 
      } 
      return ci; 
     })!) 
     lastUsedFilter = FilterTypes.Brightness; 
     appliedFilters.updateValue(0.5, forKey: FilterTypes.Brightness) 

Проблема:

1st: Я не знаю, правильно ли я использую обработчик завершения с момента его первого раза, поэтому я буду приветствовать некоторые советы.

2nd: индикатор не отображается или не останавливается. приложение просто замерзает в течение нескольких секунд и обратно, что заставило меня подумать, может быть, завершение не выполняет свою работу в фоновом режиме.

спасибо большое за ваше время.

+0

Как вы добавляете индикатор? Программно или через раскадровку? – kye

+0

через раскадровку, ее уже установленный i только startanimation или остановить его. – Maz

ответ

0

Окончательно нашли решение. Это не означает, что функция возвращает что-либо и использует закрытие для назначения объекту при его готовности. я думаю, что было подключение к main_que так это поправка:

func setBrightness(ciImage: CIImage, intensity: Float = 0.5, completion: (CIImage) -> Void) { 
let filter = CIFilter(name: "CIColorControls"); 
filter?.setValue(ciImage, forKey: kCIInputImageKey); 
filter?.setValue(intensity, forKey: "inputBrightness"); 
completion(filter?.outputImage)!; 

}

и назвать его и присвоить изображение:

case .Brightness: 
    self.loader.startAnimating(); 
    processor.setBrightness(CIImage(image: imgViewFiltered.image!)!, completion: { (let ci) in 
     dispatch_async(dispatch_get_main_queue()) { 
      imgViewFiltered.image = UIImage(CIImage: ci); 
      self.loader.stopAnimating(); 
     } 
    })! 
    lastUsedFilter = FilterTypes.Brightness; 
    appliedFilters.updateValue(0.5, forKey: FilterTypes.Brightness) 

надеюсь, что это может помочь другим, обращенную же вопрос ,

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