我正在尝试获取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方法,但收到一条错误消息,提示数据未完全加载。有什么想法吗?
答案 0 :(得分:2)
从documentation到requestData
:
在读取(或下载)资产资源数据时,Photos至少调用一次您的
handler
块,并逐步提供数据块。读取所有数据后,Photos会调用您的completionHandler
块以指示数据已完成。 (此时,资产的完整数据是来自对您的data
块的所有调用中的handler
参数的串联。)如果Photos无法完成读取或下载资产资源数据,它将调用您的{ {1}}块,其中包含错误说明。如果用户取消下载,则数据完成后,照片也可以调用completionHandler
块,并且显示非零错误。
因此,您需要从每次对闭包的调用中构建数据,然后在完成处理程序中可以对完成的数据进行处理。
completionHandler