gpt4 book ai didi

ios - 从操作内部访问队列

转载 作者:行者123 更新时间:2023-11-30 11:59:12 25 4
gpt4 key购买 nike

我正在使用 OperationOperationQueue 下载一系列视频。这是我的下载操作

import UIKit
import AVFoundation

class VideoDownloader: Operation {
let videoRecord: VideoRecord

init(videoRecord: VideoRecord) {
self.videoRecord = videoRecord
}

override func main() {
if isCancelled {
return
}

let asset = AVURLAsset(url: videoRecord.url)
asset.resourceLoader.setDelegate(self, queue: DispatchQueue.main)

let exporter = AVAssetExportSession(asset: asset, presetName: AVAssetExportPresetHighestQuality)
let filename = "\(videoRecord.id).mp4"

let documentsDirectory = FileManager.default.urls(for: FileManager.SearchPathDirectory.documentDirectory, in: FileManager.SearchPathDomainMask.userDomainMask).last!
let outputURL = documentsDirectory.appendingPathComponent(filename)

exporter?.outputURL = outputURL
exporter?.outputFileType = .mp4

exporter?.exportAsynchronously {
if let error = exporter?.error {
print(error)
} else {
print(outputURL)
}
}
}
}

extension VideoDownloader: AVAssetResourceLoaderDelegate {

}

这很好用。但我对下面的行感到担忧。

asset.resourceLoader.setDelegate(self, queue: DispatchQueue.main)

目前我正在主线程上设置委托(delegate)。我认为这是不正确的,因为它在后台线程中运行。我不确定,所以如果我错了,请纠正我。

我认为最好将其队列设置为当前正在运行操作的队列。但是如何从操作类访问队列呢?

最佳答案

在 main() 中,您使用异步 API,例如 AVAssetExportSession 和 AVResourceLoaderDelegate,您应该实现异步操作(Apple 有相关文档)。您必须更改某些内部属性的状态并调用 willChangeValueForKey 和 didChangeValueForKey,以便在异步操作完成时操作队列收到通知。如果您不这样做,OperationQueue 将认为您的操作将在 main() 方法返回后立即完成。 OperationQueue 将从队列中删除操作,并且 maxConcurrentOperations 将不会受到尊重,因为实际上您的操作仍将在后台运行。

因为您使用的是非阻塞的异步 API,并且可能在多个线程中运行,所以我建议您创建自己的后台队列或为 AVResourceLoaderDelegate 使用现有的全局队列。只需保留OperationQueue的内部队列即可,它将充当一个简单的同步层。

关于ios - 从操作内部访问队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47457402/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com