首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHAssetResourceManager的requestData返回多个对象

PHAssetResourceManager的requestData返回多个对象
EN

Stack Overflow用户
提问于 2019-04-28 19:37:32
回答 1查看 421关注 0票数 3

我正在尝试获取PHAssetResource的数据值,这样我就可以使用它生成一个CGImageSource,如下所示:

代码语言:javascript
复制
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语句打印如下:

代码语言:javascript
复制
data: 1048576 bytes
data: 972120 bytes
data: 0 bytes

我不知道这三个对象是什么,但只有第一个对象才会产生我想要的CGImageSource。问题是,当我接收到第一个对象时,我无法停止请求,所以它不断地调用处理程序。我尝试在cancelDataRequest中调用getDataFromImageSource方法,但是我发现一个错误,它说数据没有被完全加载。有什么想法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-04-28 19:51:13

来自文档 for requestData

在读取(或下载)资产资源数据时,Photos至少调用您的handler块一次,逐步提供大块数据。读取所有数据后,Photos将调用您的completionHandler块以指示数据已完成。(此时,资产的完整数据是对data块的所有调用中的handler参数的连接。)如果Photos无法完成读取或下载资产资源数据,它将调用您的completionHandler块,并说明错误。如果用户取消下载,当数据完成时,照片也可以使用非零错误调用completionHandler块。

因此,您需要构建从每个调用到闭包的数据,然后在完成处理程序中,您可以对该完整数据执行一些操作。

代码语言:javascript
复制
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))
    }
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55893928

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档