Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/111.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 使用Swift 4在共享扩展中加载视频_Ios_Swift_Swift4_Movie_Share Extension - Fatal编程技术网

Ios 使用Swift 4在共享扩展中加载视频

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,

我正在开发一个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
项。但不是第二个和第三个
打印

有人能告诉我这部电影是怎么通过的吗?我怎么处理


感谢

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),而不是视频数据