我在ViewDidLoad函数中有一些代码,该代码将在其调用堆栈的末尾设置一个类变量。我试图将代码重构为一个单独的函数,该函数将返回值而不是设置类变量。
由于我缺乏快速的知识,所以我不确定问题出在哪里,好像我的函数返回的太早了,正如我可以在调试器中告诉的那样,在将shareURL
设置为publicUrl.absoluteString
。
func getShareUrl() -> String? {
var shareURL: String?
if let extItem = extensionContext?.inputItems.first as? NSExtensionItem,
let itemProvider = extItem.attachments?.first as? NSItemProvider,
itemProvider.hasItemConformingToTypeIdentifier("public.url") {
itemProvider.loadItem(forTypeIdentifier: "public.url", options: nil) { (url, error) in
if let publicUrl = url as? URL {
shareURL = publicUrl.absoluteString
}
}
}
return shareURL
}
我还可以在调试器中看到,在主函数返回之后,稍后会调用内部函数。
如何在返回之前等待内部调用完成?或正确的快速方法是什么?
答案 0 :(得分:3)
您需要完成,因为方法itemProvider.loadItem(forTypeIdentifier
是异步的
func getShareUrl(completion:@escaping (String?) -> ()) {
if let extItem = extensionContext?.inputItems.first as? NSExtensionItem,
let itemProvider = extItem.attachments?.first as? NSItemProvider,
itemProvider.hasItemConformingToTypeIdentifier("public.url") {
itemProvider.loadItem(forTypeIdentifier: "public.url", options: nil) { (url, error) in
if let publicUrl = url as? URL {
completion(publicUrl.absoluteString)
} else {
completion(nil)
}
}
}
}