通常,我们使用NSItemProvider
的loadItem(forTypeIdentifier:options:completionHandler:)
方法来加载对应类型的对象。但是Finder提供的信息有问题。不能使用推荐的类型来获得想要的对象。
比如分享mp4文件时,Finder提供的NSItemProvider
是这样的。
<NSItemProvider: 0x6000000bfa40> {types = (
"public.file-url",
"public.url",
"public.mpeg-4"
)}
你用"public.mpeg-4"作为类型来获取数据,不能获得视频文件对应的URL
。这是很罕见的。因为大部分情况下,比如通过照片应用来获得视频时,都可以通过这种方式获得URL。
Finder提供给"public.mpeg-4"实际上是一个Data
。但是这个Data
用在这里实际上是有问题的。苹果不应该这么做。为什么呢?因为相比于其它类型的文件,比如图片或者声音之类的,视频文件可以是很大的。如果你要使用这个视频文件,那么通过Data
来加载,就会占据大量的内存。实际上,苹果自己就在加载视频的文档中写到,不要全部加载到内存。
因为存在这个限制,Finder实际上传来的Data可能是不完整的。比如我尝试分享一个4GB的视频时,实际获得的Data
的大小是415MB,并不完整。
结论,既然Data
既占内存,又可能不完整,为什么Finder还要提供呢?只能说,苹果做错了。
临时的处理办法是这样的,先用"public.mpeg-4"尝试获取URL
,如果获取失败。那么就看NSItemProvider
是否支持URL
。如果支持就再用"public.url"尝试获取URL
。如果还不行,那就认为是没法处理。为什么不反过来呢?因为大部分的情况,都是第一种方式就能直接处理。Finder这么做实际上是错误的。但是为了适应它,才需要调整我们的代码。