Ios 使用Swift 4在共享扩展中加载视频
我正在开发一个iOS应用程序,它提供了一个共享扩展,可以将视频从照片库上传到服务器。 我找不到任何关于如何处理视频的例子 这是我的密码:Ios 使用Swift 4在共享扩展中加载视频,ios,swift,swift4,movie,share-extension,Ios,Swift,Swift4,Movie,Share Extension,我正在开发一个iOS应用程序,它提供了一个共享扩展,可以将视频从照片库上传到服务器。 我找不到任何关于如何处理视频的例子 这是我的密码: if itemProvider.hasItemConformingToTypeIdentifier("public.movie") { print ("A movie has been chosen") itemProvider.loadItem(forTypeIdentifier: "public.movie", options: nil,
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
项。但不是第二个和第三个打印
有人能告诉我这部电影是怎么通过的吗?我怎么处理
感谢loadItem异步运行,并且当您处理视频文件时,文件大小比图像大得多,因此loadItem没有时间在self.extensionContext?之前完成自身。completeRequest运行并关闭共享扩展
我找到的解决方案包括以下几点:
(1) 创建一个布尔变量,用于测量loadItem函数是否完成
var loadItemDone: Bool = false
(2) 编写一个递归函数,定期检查loadItem函数是否已完成。如果是,则运行completeRequest调用。如果不是,则继续递归。在我的例子中,我每秒检查一次完成情况,这就是为什么它会显示“之后:1”
(3) 当loadItem完成时,将loadItemDone变量设置为true:
if attachment.hasItemConformingToTypeIdentifier("com.apple.quicktime-movie") {
// Do stuff with the movie now.
self.loadItemDone = true
}
“公共电影”不适合我。我不得不使用“com.apple.quicktime电影”
另外,DispatchQueue对我不起作用,这就是为什么我不得不稍微修改一下。。。我很想从任何熟悉共享扩展中线程的人那里听到更好的解决方案…loadItem异步运行,当您处理视频文件时,文件大小比图像大得多,因此,loadItem没有时间在self.extensionContext?之前完成自身。completeRequest运行并关闭共享扩展
我找到的解决方案包括以下几点:
(1) 创建一个布尔变量,用于测量loadItem函数是否完成
var loadItemDone: Bool = false
(2) 编写一个递归函数,定期检查loadItem函数是否已完成。如果是,则运行completeRequest调用。如果不是,则继续递归。在我的例子中,我每秒检查一次完成情况,这就是为什么它会显示“之后:1”
(3) 当loadItem完成时,将loadItemDone变量设置为true:
if attachment.hasItemConformingToTypeIdentifier("com.apple.quicktime-movie") {
// Do stuff with the movie now.
self.loadItemDone = true
}
“公共电影”不适合我。我不得不使用“com.apple.quicktime电影”
另外,DispatchQueue对我不起作用,这就是为什么我不得不稍微修改一下。。。我很想听到更熟悉共享扩展中线程的人提供更好的解决方案…在应用程序组的帮助下,您可以解决以下问题:
从库中获取视频并将数据保存在userdefaults中
通过appschems将USerDefault密钥传输到,并在app的app delgate中拦截它的open URL方法
使用相同的密钥加载该视频并将其转发到服务器
有关应用程序组和共享扩展的参考:在应用程序组的帮助下,您可以解决以下问题:
从库中获取视频并将数据保存在userdefaults中
通过appschems将USerDefault密钥传输到,并在app的app delgate中拦截它的open URL方法
使用相同的密钥加载该视频并将其转发到服务器
有关应用程序组和共享扩展的参考信息:请检查此示例是否有助于您,谢谢,但您提到的示例是关于我已经处理过的图像的。我不知道视频是如何传递的。共享扩展名提供所选视频项目的位置(文件url)而不是视频数据检查此示例是否对您有帮助谢谢,但您提到的示例是关于我已经处理过的图像的。我无法计算视频是如何传递的。共享扩展为您提供所选视频项目的位置(文件url),而不是视频数据