2015-11-25 7 views
0

Привет, ребята (Мой первый вопрос здесь, я думаю :)),показ ожидания до обработки изображения

Я новичок в программировании Swift и iOS. Я делаю фильтрацию изображений, и я пытаюсь использовать UIActivityIndicatorView для времени ожидания до загрузки фильтрованного изображения. Индикатор активности заключен в другое представление с текстовой меткой: «Выполняется фильтрация». Однако вид ожидания не отображается.

С помощью отладки я заметил, что представление не мгновенно обновляется после выполнения строки кода; представление обновляется после выполнения всего блока. Таким образом, в этом случае, следующий код не работает:

showActivityView() //shows the view with text and spinner 
filteredImageView.image = imageProcessor.clearFilters().addFilter(currentFilter).filter() //shows filtered image on image view 
hideActivityView() //hides the view with text and spinner 

Это не работает, потому что, я думаю, весь вид обновляется после hideActivityView() завершается. Любая идея о том, как реализовать это чистым способом.

Также было бы неплохо иметь хорошие ссылки, если кто-то знает. Я пытаюсь найти себя, но пока не повезло. Большое спасибо.

+0

Используйте асинхронную рассылку с обратным вызовом для фильтрации. –

ответ

0

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

var waitQueue: dispatch_queue_t = dispatch_queue_create("waiter", nil)

А затем поместить все рабочие места фильтрации в очереди .. как описано в растворе mad_manny в.

let activityView = showActivityView("Filter in Progress..") 
dispatch_async(waitQueue) { 
self.currentFilter = filter.changeIntensity((filter.MIN_INTENSITY+filter.MAX_INTENSITY)/2)     
self.filteredImage = self.imageProcessor.clearFilters().addFilter(self.currentFilter).filter()     
dispatch_async(dispatch_get_main_queue()) {      
    self.filteredImageView.image = self.filteredImage      
    self.hideActivityView(activityView)      
    self.showFilteredImage()     
    }    
} 
1

Вы shoud делаете фильтрацию в другом потоке. Вы можете сделать это, используя Grand Central Dispatch (tutorial here). Ваш код будет выглядеть примерно следующим образом:

showActivityView() //shows the view with text and spinner 
var image: UIImage? 

dispatch_async(dispatch_get_global_queue(QOS_CLASS_USER_INITIATED, 0), { 

    image = imageProcessor.clearFilters().addFilter(currentFilter).filter() //shows filtered image on image view 

    dispatch_async(dispatch_get_mein_queue(), { 
     filteredImageView.image = image! 
     hideActivityView() //hides the view with text and spinner 
    } 

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