Ios 将相集数组快速转换为URL数组
我有一个Ios 将相集数组快速转换为URL数组,ios,swift,asynchronous,Ios,Swift,Asynchronous,我有一个PHAssets的数组,所以我想把它转换成URL的数组 func getURL(ofPhotoWith mPhasset: PHAsset, completionHandler : @escaping ((_ responseURL : URL?) -> Void)) { let options: PHContentEditingInputRequestOptions = PHContentEditingInputRequestOptions() options.c
PHAssets的数组
,所以我想把它转换成URL的数组
func getURL(ofPhotoWith mPhasset: PHAsset, completionHandler : @escaping ((_ responseURL : URL?) -> Void)) {
let options: PHContentEditingInputRequestOptions = PHContentEditingInputRequestOptions()
options.canHandleAdjustmentData = {(adjustmeta: PHAdjustmentData) -> Bool in
return true
}
mPhasset.requestContentEditingInput(with: options, completionHandler: { (contentEditingInput, info) in
completionHandler(contentEditingInput!.fullSizeImageURL)
})
}
func getUrlsFromPHAssets(assets:[PHAsset], completion: @escaping ((_ urls:[URL]) -> ())){
var arrUrl:[URL] = []
for asset in assets {
self.getURL(ofPhotoWith: asset) { (url) in
arrUrl.append(url!)
}
}
completion(arrUrl)
}
我在main中调用下面的函数
self.getUrlsFromPHAssets(assets: assets, completion: { (urls) in
print(urls)
})
因此,在函数getUrlsFromPHAssets
中,如何等待将URL附加到URL数组的循环完成,然后返回它
更新函数getUrlsFromPHAssets
:
更新函数后,结果似乎正常,但我不确定它是否会在任何时候更正。在第二个函数中,您使用
for
循环来执行一系列异步函数。每当您有多个异步函数,它们的完成都像这样相互依赖时,您可能需要一个DispatchGroup
。此对象可以调用enter()
,以指示异步块正在启动,并在异步块完成后调用leave()
func getUrlsFromPHAssets(assets: [PHAsset], completion: @escaping ((_ urls:[URL]) -> ())) {
var array: [URL] = []
let group = DispatchGroup()
for asset in assets {
group.enter()
self.getURL(ofPhotoWith: asset) { (url) in
// I changed this from force unwrapping.
// Seems like it's totally possible to get back a nil URL,
// in which case, you don't want to crash
if let url = url {
array.append(url)
}
group.leave()
}
}
// This closure will be called once group.leave() is called
// for every asset in the above for loop
group.notify(queue: .main) {
completion(array)
}
}
我刚刚更新了我的函数,结果似乎还可以。但我不确定。你能检查一下吗?嗯。。。不,你更新的代码根本不起作用。您试图绕过这是一个异步函数的事实。非常感谢。我得到了它。
func getUrlsFromPHAssets(assets: [PHAsset], completion: @escaping ((_ urls:[URL]) -> ())) {
var array: [URL] = []
let group = DispatchGroup()
for asset in assets {
group.enter()
self.getURL(ofPhotoWith: asset) { (url) in
// I changed this from force unwrapping.
// Seems like it's totally possible to get back a nil URL,
// in which case, you don't want to crash
if let url = url {
array.append(url)
}
group.leave()
}
}
// This closure will be called once group.leave() is called
// for every asset in the above for loop
group.notify(queue: .main) {
completion(array)
}
}