У меня есть следующая функция, которая возвращает [CIImage]
для моей цели - отображение некоторых метаданных фотографий в таблицеView.Почему приложение заблокировано семафором?
func getCIImages() -> [CIImage] {
var images = [CIImage]()
let assets = PHAsset.fetchAssetsWithMediaType(.Image, options: nil)
for i in 0..<assets.count {
guard let asset = assets[i] as? PHAsset else {fatalError("Cannot cast as PHAsset")}
let semaphore = dispatch_semaphore_create(0)
asset.requestContentEditingInputWithOptions(nil) { contentEditingInput, _ in
//Get full image
guard let url = contentEditingInput?.fullSizeImageURL else {return}
guard let inputImage = CIImage(contentsOfURL: url) else {return}
images.append(inputImage)
dispatch_semaphore_signal(semaphore)
}
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER)
}
return images
}
но это stucks в семафоре ждут и не идут дальше. Я прошел много учебников, но другие варианты GCD не работают. Я думаю, это из-за симулятора, я не знаю, не могу проверить на реальном устройстве. Пожалуйста помоги.
Почему вы вынуждаете квазисинхронный запрос вообще? – vadian
@vadian, потому что я хочу отображать некоторые метаданные 'CIImages' в' tableView', и это можно сделать синхронно с одним вызовом 'tableView.reloadData()'. –