我正在开发一个iOS应用程序,该应用程序提供了一个共享扩展,可以将视频从照片库上传到服务器。 我找不到任何关于如何处理视频的例子。
这是我的代码:
if itemProvider.hasItemConformingToTypeIdentifier("public.movie") {
print ("A movie has been chosen")
itemProvider.loadItem(forTypeIdentifier: "public.movie", options: nil, completionHandler: { (data, error) in
print ("Loaded the video")
if let video = data as? Data {
// Do stuff with the movie now.
print ("The movie should be loaded now")
}
self.extensionContext?.completeRequest(returningItems: [], completionHandler:nil)
})
}
第一个print
被打印出来,所以我实际上是public.movie
项目。但不是第二个和第三个print
。
有人可以告诉我电影是如何通过的以及我如何处理它?
由于
答案 0 :(得分:0)
loadItem以异步方式运行,当您使用视频文件时,文件大小远远大于图像,因此在self.extensionContext?.completeRequest运行并关闭共享扩展之前,loadItem没有时间完成自身。
我找到的解决方案涉及以下内容:
(1)创建一个布尔变量,用于衡量loadItem函数是否完整。
var loadItemDone: Bool = false
(2)编写一个递归函数,定期检查loadItem函数是否已完成。如果是,则运行completeRequest调用。如果没有,继续递归。在我的情况下,我每秒检查一次完成,这就是为什么它说“after:1”。
func waitForLoadItemToComplete(after seconds: Int) {
let deadline = DispatchTime.now() + .seconds(seconds)
DispatchQueue.main.asyncAfter(deadline: deadline) {
if self.loadItemDone == false{
self.waitForLoadItemToComplete(after: 1)
}else{
let alert = UIAlertController(title: "Success!", message: "Your file is uploaded!", preferredStyle: .alert)
let action1 = UIAlertAction(title: "Yeah!", style: .cancel) { (action) in
print("User acknowledged file uploaded.")
self.extensionContext!.completeRequest(returningItems: [], completionHandler: nil)
}
alert.addAction(action1)
self.present(alert, animated: true, completion: nil)
}
}
}
(3)当loadItem完成时,将loadItemDone变量设置为true:
if attachment.hasItemConformingToTypeIdentifier("com.apple.quicktime-movie") {
// Do stuff with the movie now.
self.loadItemDone = true
}
'public.movie'对我不起作用。我不得不使用'com.apple.quicktime-movie'
另外,DispatchQueue对我不起作用,这就是为什么我不得不破解...我希望听到更多熟悉分享扩展中的线程的人提供更好的解决方案......
答案 1 :(得分:0)
在应用程序组的帮助下,您可以解决:http://www.atomicbird.com/blog/sharing-with-app-extensions
有关应用群组和分享扩展程序的参考:https://medium.com/@abhishekthaplithapliyal/ios-share-extension-930ba1ad3c3d