PHAsset копирование видео завершение - PullRequest
0 голосов
/ 27 августа 2018

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

    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"}}

1 Ответ

0 голосов
/ 27 августа 2018

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

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

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

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

...