【问题标题】:Swift Convert array of PHAsset to array of URLSwift将PHAsset数组转换为URL数组
【发布时间】:2018-02-27 20:08:32
【问题描述】:

我有一个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

func getUrlsFromPHAssets(assets:[PHAsset], completion: @escaping ((_ urls:[URL]) -> ())){
    var arrUrl:[URL] = []
    var index:Int = 0
    for asset in assets {
        self.getURL(ofPhotoWith: asset, completionHandler: { (url) in
            arrUrl.append(url!)
            if index == assets.count - 1 {
                completion(arrUrl)
            }
            index = index + 1
        })
    }
}

更新功能后,结果似乎还可以,但我不确定它是否会随时更正。

【问题讨论】:

    标签: ios swift asynchronous


    【解决方案1】:

    在您的第二个函数中,您使用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)
        }
    }
    

    【讨论】:

    • 我刚刚更新了我的函数,结果似乎还可以。但我不确定。可以查一下吗?
    • 嗯...不。您更新的代码根本不起作用。你试图绕过它是一个异步函数的事实。
    • 非常感谢。我明白了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-27
    • 2014-08-16
    • 1970-01-01
    • 1970-01-01
    • 2018-02-08
    • 2018-11-22
    • 1970-01-01
    相关资源
    最近更新 更多