PHAssetResourceManager的requestData返回多个对象

时间:2019-04-28 19:37:33

标签: ios swift photokit

我正在尝试获取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
                            }
                        }

但是,我没有返回一个数据对象,而是得到了三个。因此,打印语句将打印以下内容:

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

我不确定这三个对象是什么,但是只有第一个对象会产生我想要的CGImageSource。问题在于,当我收到第一个对象时,我无法停止请求,因此它会不断反复调用处理程序。我尝试在getDataFromImageSource内调用cancelDataRequest方法,但收到一条错误消息,提示数据未完全加载。有什么想法吗?

1 个答案:

答案 0 :(得分:2)

documentationrequestData

  

在读取(或下载)资产资源数据时,Photos至少调用一次您的handler块,并逐步提供数据块。读取所有数据后,Photos会调用您的completionHandler块以指示数据已完成。 (此时,资产的完整数据是来自对您的data块的所有调用中的handler参数的串联。)如果Photos无法完成读取或下载资产资源数据,它将调用您的{ {1}}块,其中包含错误说明。如果用户取消下载,则数据完成后,照片也可以调用completionHandler块,并且显示非零错误。

因此,您需要从每次对闭包的调用中构建数据,然后在完成处理程序中可以对完成的数据进行处理。

completionHandler