推特仅支持0.5秒到140秒之内长度的视频,因此上传前要先检验视频的长度。测试时,我发现,Finder分享的视频时长始终为0。
我查询了一下,最初看到的说法是,AVAsset
(AVMovie
的父类)的加载是异步的,不能够立即获得时长,而需要用键值观察的方法,注册通知来观察duration
这个属性何时变化。昨晚看到这里,我就睡了。
今天再看,发现有协议AVAsynchronousKeyValueLoading
,可以用来异步处理键值。方法loadValuesAsynchronously(forKeys:completionHandler:)
会在加载完成后执行completionHandler
。这样就不用我们自己手动注册键值观察的通知了。
但是,我测试这个方法不好用。Finder传来的视频,无论是否使用这个异步方法,时长都始终为0。
我不用Finder,采用照片应用进行调试,发现无论是不是用这个异步方法,都能获得正确的时长。
结合上一篇Finder分享视频到共享扩展的一些限制的小结。我产生了新的想法,经过测试,我的猜想是正确的。
那就是,AVMovie
在读取URL
的时候,会正确获得时长,如果是Data
的话,则不可以。想测试也很简单,把URL
变成Data
,再创建AVMovie
;或者把Data
写入到URL
,再创建AVMovie
。就可以证实了。
我不清楚这个是苹果API的错误,还是特性。但是这个至少是没有注明的。