我正在尝试获取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方法,但是我发现一个错误,它说数据没有被完全加载。有什么想法吗?
发布于 2019-04-28 19:51:13
来自文档 for 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))
}
}https://stackoverflow.com/questions/55893928
复制相似问题