PHAssetResourceManager's requestData Возвращение нескольких объектов - PullRequest
2 голосов
/ 28 апреля 2019

Я пытаюсь получить значение данных PHAssetResource, чтобы я мог сделать CGImageSource с ним так:

let resources = PHAssetResource.assetResources(for: imageAsset)
let fullSizePhotoResources = resources.filter { $0.type == .fullSizePhoto }
let targetResource = fullSizePhotoResources[0]

let resourceManager = PHAssetResourceManager()

resourceManager.requestData(for: targetResource, options: nil, dataReceivedHandler: { (resourceData) in

                            let imageSource = CGImageSourceCreateWithData(resourceData as CFData, nil)
                            print("data: \(resourceData)")
                            handler(self.getDataFromImageSource(imageSource: imageSource))

                        }) { (inError) in

                            if inError != nil {
                                //handle error
                            }
                        }

однако вместо того, чтобы возвращать один объект данных, я получаю три. Таким образом, оператор print печатает это:

data: 1048576 bytes
data: 972120 bytes
data: 0 bytes

Я не уверен, что все эти три объекта, но только первый из них приводит к CGImageSource, который я хочу. Проблема в том, что у меня нет возможности остановить запрос, когда я получаю первый объект, поэтому он продолжает вызывать обработчик снова и снова. Я попытался вызвать метод cancelDataRequest внутри getDataFromImageSource, но я получаю сообщение об ошибке, говорящее о том, что данные не были полностью загружены. Есть идеи?

1 Ответ

2 голосов
/ 28 апреля 2019

Из документации для requestData:

При чтении (или загрузке) данных ресурса ресурса, Photos вызывает ваш блок handler как минимум один раз, постепенно предоставляя кускиданных.После прочтения всех данных Photos вызывает ваш блок completionHandler, чтобы указать, что данные заполнены.(На данный момент полными данными для ресурса является объединение параметров data из всех вызовов вашего блока handler.) Если Photos не может завершить чтение или загрузку данных ресурса ресурса, он вызывает ваш блок completionHandler сописание ошибки.Фотографии могут также вызывать блок completionHandler с ненулевой ошибкой, когда данные завершены, если пользователь отменяет загрузку.

Таким образом, вам необходимо собрать данные из каждого вызова до закрытия изатем в обработчике завершения вы можете что-то сделать с этими полными данными.

var imageData = Data()
resourceManager.requestData(for: targetResource, options: nil, dataReceivedHandler: { (resourceData) in
    imageData.append(resourceData)
}) { (inError) in
    if let error = inError {
        //handle error
    } else {
        let imageSource = CGImageSourceCreateWithData(imageData as CFData, nil)
        print("data: \(resourceData)")
        handler(self.getDataFromImageSource(imageSource: imageSource))
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...