私は、目的のために[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私は 'CIImages'のいくつかのメタデータを' tableView'に表示したいので、 'tableView.reloadData()'呼び出しを使って同期的に行うことができます。 –