我不确定是否重复,我进行了搜索,但找不到答案。如果是的话,请给我指出类似的问题。 我在完成处理程序中设置imageURL变量的值:
var imageURL: URL?
let options = PHContentEditingInputRequestOptions()
imageAsset.requestContentEditingInput(with: options, completionHandler: { (contentEditingInput: PHContentEditingInput?, _) in
imageURL = contentEditingInput?.fullSizeImageURL
})
//prints nil
print(imageURL)
现在,处理程序中的imageURL的值不是nil,而是紧随其后(在print语句中)为nil。为什么会发生这种情况,以及如何解决此问题而不必在完成处理程序块中编写所有后续代码?
答案 0 :(得分:1)
不幸的是,您无法按照自己的方式“修复”它。理论上,此处的完成处理程序可以同步调用(即,在调用requestContentEditingInput
时),但是可以(很可能会)在资产准备好以后的某个时间调用。这可能包括发生在其他线程上的资产的实际downloading或任何其他不可预测的耗时准备。
换句话说,函数requestContentEditingInput
会立即返回给您(并且您的代码将继续执行),但是该函数也开始在后台执行一些工作。该后台工作完成后,将调用您的处理程序块。
执行流程的性质意味着您不能保证(当然也不能假设)在执行前进到您的print(imageURL)
行之前将调用处理程序。
这种异步是很常见的模式!不用担心。您需要将随后必须运行的所有代码放入该处理程序块中(或在文件中更干净的情况下,从处理程序块调出到另一个函数)。
答案 1 :(得分:0)
很可能直到以后再调用完成,因为代码正在另一个线程上运行。尝试在完成块中放入一条打印语句,以查看代码执行的顺序。
答案 2 :(得分:0)
使用处理程序时,每次构建所用的线程时间可能不同。
我建议您创建一个在处理程序内部调用的方法。
赞:
func edit(){
var imageURL: URL?
let options = PHContentEditingInputRequestOptions()
imageAsset.requestContentEditingInput(with: options, completionHandler: { (contentEditingInput: PHContentEditingInput?, _) in
imageURL = contentEditingInput?.fullSizeImageURL
display(url:imageURL)
})
}
func display(url: String) {
print(imageURL)
}