我正在创建一个iOS共享扩展,但我遇到了一个问题。shareSetup
函数检查附件是否为文本类型。正如您在下面的代码中看到的那样,selectedText
的值被分配,但随后被清除。注意:selectedText
将被设置为textview值。
var selectedText = ""
func shareSetup() {
let extensionItem = extensionContext?.inputItems[0] as! NSExtensionItem
let contentTypeText = kUTTypeText as String
for attachment in extensionItem.attachments! {
if attachment.hasItemConformingToTypeIdentifier(contentTypeText){
attachment.loadItem(forTypeIdentifier: contentTypeText, options: nil,completionHandler: { (results, error) in
let text = results as! String
self.selectedText = text
print(self.selectedText) //prints correct value text
_ = self.isContentValid()
})
}
}
print(self.selectedText)// prints nothing
}
override func viewDidLoad() {
shareSetup()
}
附件。loadItem(forTypeIdentifier:方法似乎是异步的-所以它的主体(completionHandler)不是在调用时直接执行,而是在一段时间后,当item将被加载时执行。在这种情况下print(self.selectedText)打印已经存在的文本。但是第二次打印是同步执行的,在这个确切的时间点,这个值仍然是空的——loadItem尚未执行。
所以当你执行这段代码时-你让它工作了它的步骤类似于这样:
- 开始shareSetup
- 开始执行for循环
- 开始依恋。loadItem (forTypeIdentifier调用
- 完成循环
- print(self.selectedText) where is nothing
- 在加载项目并执行其主体时调用completionHandler
- 打印(self.selectedText)如果它已经有了
查看更多异步调用和完成处理程序的使用。