我正在尝试与UIActivityViewController共享应用程序中的视频。
所以,这个过程看起来是这样的:
用户正在点击共享按钮。
我必须用我的功能为他准备视频。
我正在为我的UIActivityIndicatorView启动动画并启动saveToShare()
我正在从saveToShare()向控制器发送通知。
控制器中的观察者正在启动函数saveToShare
shareVideo()看起来是这样的:

func videoIsReady() {
self.activityIndicator.stopAnimating()
self.activityIndicator.isHidden = true


let videoName = "NewWatermarkedVideoNew2Share.mov"
let exportPath = NSTemporaryDirectory().appending(videoName)
let exportUrl = URL(fileURLWithPath: exportPath)

let urlData = NSData(contentsOf: exportUrl)

if ((urlData) != nil){

    let videoLink = exportUrl

    let objectsToShare = [videoLink]
    let activityVC = UIActivityViewController(activityItems: objectsToShare, applicationActivities: nil)
    activityVC.popoverPresentationController?.sourceView = self.view // so that iPads won't crash
    activityVC.setValue("#myhashtag", forKey: "subject")

    activityVC.excludedActivityTypes = [UIActivityType.airDrop, UIActivityType.addToReadingList, UIActivityType.assignToContact, UIActivityType.copyToPasteboard, UIActivityType.openInIBooks, UIActivityType.postToTencentWeibo, UIActivityType.postToVimeo, UIActivityType.postToWeibo, UIActivityType.print, UIActivityType.saveToCameraRoll, UIActivityType.postToFlickr, UIActivityType.postToTwitter, UIActivityType(rawValue: "com.apple.reminders.RemindersEditorExtension"), UIActivityType(rawValue: "com.apple.mobilenotes.SharingExtension"),UIActivityType(rawValue: "com.google.Drive.ShareExtension"), UIActivityType(rawValue: "com.apple.mobileslideshow.StreamShareService")]

    self.present(activityVC, animated: true, completion: {

    })


} else {
    print("url is empty...")
}

}

它可以工作,但是我的shareVideo()在共享对话框之前没有隐藏,并且在显示该对话框之后实际上工作了几秒钟。
这里怎么了?
好吧,如果我把UIActivityIndicatorView放进UIActivityIndicatorView中,这样我的问题就解决了,但我不知道为什么这个问题一开始就出现了。

最佳答案

为了让它立即消失,您需要同步调用主队列上的代码。为了避免死锁(以防从主队列调用videoIsReady()),请使用我开发的这个小扩展:

extension DispatchQueue {

    class func safeUISync(execute workItem: DispatchWorkItem) {
        if Thread.isMainThread { workItem.perform() }
        else                   { DispatchQueue.main.sync(execute: workItem) }
    }

    class func safeUISync<T>(execute work: () throws -> T) rethrows -> T {
        if Thread.isMainThread { return try work() }
        else                   { return try DispatchQueue.main.sync(execute: work) }
    }
}

现在可以按如下方式调用代码:
func videoIsReady() {
    DispatchQueue.safeUISync {
        self.activityIndicator.stopAnimating()
        self.activityIndicator.isHidden = true
    }

    ...
}

关于ios - UIActivityIndi​​catorView不能在正确的时间停止,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41120918/

10-09 02:06