             for i in 0..<assets.count {
                 let asset = assets[i]
                 
+                asset.progress = 0.0
+                self.notify(with: #selector(DKImageAssetExporterObserver.exporterWillBeginExporting(exporter:asset:)), object: self, objectTwo: asset)
+                
                 if operation.isCancelled {
                     exportCompletionBlock(asset, self.makeCancelledError())
                     continue

        return exportQueue
    }()
    
    private let semaphore = DispatchSemaphore(value: 1)
    
    private var operations = [DKImageAssetExportRequestID : Operation]()
    private weak var currentAVExportSession: AVAssetExportSession?
    private var currentAssetsInRequesting = [DKAsset]()
    private var currentRequestID = DKImageAssetExportInvalidRequestID
    
    public init(configuration: DKImageAssetExporterConfiguration) {
        self.configuration = configuration.copy() as! DKImageAssetExporterConfiguration
        
        super.init()
        
        DKImageAssetDiskPurger.sharedInstance.addDirectory(self.configuration.exportDirectory)
    }
    
    /// This method starts an asynchronous export operation of a batch of asset.
    @discardableResult
    @objc public func exportAssetsAsynchronously(assets: [DKAsset], completion: @escaping ((_ info: [AnyHashable : Any]) -> Void)) -> DKImageAssetExportRequestID {
        guard assets.count > 0 else {
            completion([
                DKImageAssetExportResultRequestIDKey : DKImageAssetExportInvalidRequestID,
                DKImageAssetExportResultCancelledKey : false
                ])

                if operation.isExecuting == false && operation.isCancelled == true { // Not yet executing.
                    for asset in assets {
                        asset.error = self.makeCancelledError()
                        self.notify(with: #selector(DKImageAssetExporterObserver.exporterDidEndExporting(exporter:asset:)), object: self, objectTwo: asset)
                    }
                    
                    DispatchQueue.main.async {
                        completion?([
                            DKImageAssetExportResultRequestIDKey : requestID,
                            DKImageAssetExportResultCancelledKey : true
                            ])
