나는 내 목적으로 [CIImage]
을 돌려주는 다음 함수를 가지고 있습니다 - tableView에서 사진의 일부 메타 데이터를 표시합니다.앱이 세마포어로 차단되는 이유는 무엇입니까?
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
}
그러나 세마포어 대기 상태에 머물므로 더 이상 가지 않습니다. 많은 자습서를 살펴 보았지만 GCD의 다른 변형은 작동하지 않습니다. 나는 그것이 시뮬레이터 때문이라고 생각하는데, 나는 모른다. 실제 장치에서 테스트 할 수 없다. 도와주세요.
왜 준 동기 요청을 수행합니까? – vadian
@vadian 왜냐하면 나는'tableView'에'CIImages'의 메타 데이터를 표시하고 싶고 하나의'tableView.reloadData()'호출로 동기식으로 할 수 있기 때문입니다. –