【问题标题】:How to convert ALAsset to NSData in Swift?如何在 Swift 中将 ALAsset 转换为 NSData?
【发布时间】:2015-10-07 14:35:22
【问题描述】:

我尝试在以下代码中将 ALAsset 转换为 NSData:

        let assetUrl = NSURL(string: self.filename!)

        ALAssetsLibrary().assetForURL(assetUrl,
            resultBlock: { asset in
                let rep = asset.defaultRepresentation()

                var buffer: UInt8 = UInt8()
                var error: NSError?

                let from: Int64 = 0

                let length: Int = Int(rep.size())
                var buffered = rep.getBytes(&buffer, fromOffset: from, length: length, error: &error)

                let data = NSData(bytesNoCopy: &buffered, length: length, freeWhenDone: true)

                self.video = data
            }, // # 1
            failureBlock: { error in
                println("ReportPhoto::loadVideoFromAssetsLibrary() - Error while loading saved video from AssetsLibrary!")
            }
        )

但我在控制台中收到以下错误消息(代码中的#1):

object 0x27d02ce8: pointer being freed was not allocated

我跟踪错误中提到的对象并找到它,但我不知道是什么问题以及如何解决它!

该对象是NSData 对象内的一个属性,称为_bytes

【问题讨论】:

  • getBytes:fromOffset:length:error: 返回写入的字节数。所以我认为你的意思是let data = NSData(bytesNoCopy: &buffer, length: buffered, freeWhenDone: true)
  • 你有机会检查答案吗?
  • 抱歉耽搁了。

标签: ios swift nsdata alasset


【解决方案1】:

你的代码有两个问题:

  • rep.getBytes() 将字节写入必须具有的现有缓冲区 已分配所需的大小。您创建的缓冲区 var buffer: UInt8 = UInt8() 的大小为零。
  • (正如@Lame 在评论中已经说过的那样:)rep.getBytes() 的返回值 是写入缓冲区的字节数,而不是指向数据的指针。

最简单的方法是创建一个具有所需大小的NSMutableData 对象 并将其可变数据指针传递给rep.getBytes()

var error: NSError?
let length = Int(rep.size())
let from = Int64(0)
let data = NSMutableData(length: length)!
let numRead = rep.getBytes(UnsafeMutablePointer(data.mutableBytes), fromOffset: from, length: length, error: &error)

另请注意,自 iOS 9 起,ALAssetsLibrary 框架已被弃用。 如果您的最低部署目标是 iOS 8 或更高版本,那么您可以实现相同的目标 使用照片框架中的 PHAssetPHImageManager

let fetchResult = PHAsset.fetchAssetsWithALAssetURLs([assetUrl!], options: nil)
if let phAsset = fetchResult.firstObject as? PHAsset {
    PHImageManager.defaultManager().requestImageDataForAsset(phAsset, options: nil) {
        (imageData, dataURI, orientation, info) -> Void in
        // ...
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-01
    • 1970-01-01
    • 2017-05-12
    • 1970-01-01
    相关资源
    最近更新 更多