Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/94.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 将相集数组快速转换为URL数组_Ios_Swift_Asynchronous - Fatal编程技术网

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)
    }
}