如何在 Swift 中将 ALAsset 转换为 NSData?
How to convert ALAsset to NSData in Swift?
我尝试在以下代码中将 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
你的代码有两个问题:
rep.getBytes()
将字节写入现有缓冲区,该缓冲区必须具有
已分配所需的大小。您创建的缓冲区
var buffer: UInt8 = UInt8()
大小为零。
- (正如@Lame 在评论中所说的那样:)
rep.getBytes()
的 return 值
是写入缓冲区的字节数,而不是指向数据的指针。
最简单的方法是创建具有所需大小的 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)
另请注意,ALAssetsLibrary 框架已从 iOS 9 开始弃用。
如果您的最低部署目标是 iOS 8 或更高版本,那么您可以实现相同的目标
来自照片框架的 PHAsset
和 PHImageManager
:
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
// ...
}
}
我尝试在以下代码中将 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
你的代码有两个问题:
rep.getBytes()
将字节写入现有缓冲区,该缓冲区必须具有 已分配所需的大小。您创建的缓冲区var buffer: UInt8 = UInt8()
大小为零。- (正如@Lame 在评论中所说的那样:)
rep.getBytes()
的 return 值 是写入缓冲区的字节数,而不是指向数据的指针。
最简单的方法是创建具有所需大小的 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)
另请注意,ALAssetsLibrary 框架已从 iOS 9 开始弃用。
如果您的最低部署目标是 iOS 8 或更高版本,那么您可以实现相同的目标
来自照片框架的 PHAsset
和 PHImageManager
:
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
// ...
}
}