Завершение видео копирования PHAsset

Я хочу скопировать видеофайл из библиотеки фотографий в каталог документов моего приложения и хочу получить уведомление о завершении. Вот что я делаю:

    let videoAsset = fetchResult.object(at: indexPath.item)
    print(videoAsset.description)

    let options = PHVideoRequestOptions()
    options.version = .original

    PHImageManager.default().requestAVAsset(forVideo: videoAsset, options: options) { [weak self] (avAsset, audioMix, info) in

        if let avurlAsset = avAsset as? AVURLAsset {
            let url = avurlAsset.url
            let toUrl = //some Url
            let fileManager = FileManager.default

            do {
              try fileManager.copyItem(at: url, to: toUrl)
            } catch {
               NSLog("Unable to copy file from \(url) to \(toUrl)")
            }
        }
    }

Единственная проблема с этим подходом заключается в том, что у меня нет возможности получить уведомление о завершении copyItem. Какова альтернатива методу copyItem (или вообще другой подход к вышеизложенному), который, по крайней мере, блокирует до завершения копирования? Можно ли использовать FileHandle, читать последовательные байты и записывать в другой файл? Будет ли это достаточно синхронно?

РЕДАКТИРОВАТЬ: Как указал Алекс, copyItem на самом деле является синхронной процедурой. При ближайшем рассмотрении я вижу, что иногда получаю ошибки при копировании. Не уверен, почему ошибки разрешения появляются, когда я копирую папку «Документы» приложения.

  2018-08-27 20:30:07.485841+0530 MyProject[3577:1288452] Copying file...
2018-08-27 20:30:07.487880+0530 MyProject[3577:1288452] stat on /var/mobile/Media/DCIM/107APPLE/IMG_7915.MP4: Operation not permitted
2018-08-27 20:30:07.512994+0530
 MyProject[3577:1288452] Unable to copy file from    file:///var/mobile/Media/DCIM/107APPLE/IMG_7915.MP4 to    file:///var/mobile/Containers/Data/Application/CC13FD5A-E4CF-42A1-931F-2F1FFE799C15/Documents/IMG-0027.mov, Error Domain=NSCocoaErrorDomain Code=513 "“IMG_7915.MP4” couldn’t be copied because you don’t have permission to access “Documents”." UserInfo=   
{NSSourceFilePathErrorKey=/var/mobile/Media/DCIM/107APPLE/IMG_7915.MP4,    NSUserStringVariant=(
   Copy
  ),   

  NSDestinationFilePath=/var/mobile/Containers/Data/Application/CC13FD5A-E4CF-42A1-931F-2F1FFE799C15/Documents/IMG-0027.mov, NSFilePath=/var/mobile/Media/DCIM/107APPLE/IMG_7915.MP4, NSUnderlyingError=0x111c441c0 {Error Domain=NSPOSIXErrorDomain Code=1 "Operation not permitted"}}

person Deepak Sharma    schedule 27.08.2018    source источник


Ответы (1)


Copyitem: синхронно копирует элемент по указанному пути в новое место.

Возвращает true, если элемент был успешно скопирован или делегат файлового менеджера преднамеренно остановил операцию. Возвращает false, если произошла ошибка.

Это метод синхронизации, поэтому после его выполнения после catch без ошибок это означает успешное копирование.

https://developer.apple.com/documentation/foundation/filemanager/1407903-copyitem

person Alex L    schedule 27.08.2018
comment
Похоже, на самом деле были ошибки копирования. Я обновил вопрос с помощью Edit. - person Deepak Sharma; 27.08.2018
comment
Попробуйте добавить разрешение в plist в соответствии с вашим логом. Потому что он говорит: потому что у вас нет разрешения на доступ к «Документам». - person Alex L; 28.08.2018