我正在尝试将ALAsset的内容复制到我的应用文档目录中,如下所示:
let assetRep: ALAssetRepresentation! = alAsset.defaultRepresentation()
let sizeOfRawDataInBytes: Int = Int(assetRep.size())
var rawData: NSMutableData = NSMutableData(capacity: sizeOfRawDataInBytes)
var bufferPtr: UnsafeMutablePointer<Void> = rawData.mutableBytes
var bufferPtr8: UnsafeMutablePointer<UInt8> = UnsafeMutablePointer<UInt8>(bufferPtr)
var error: NSError? = nil
assetRep.getBytes(bufferPtr8, fromOffset: 0, length: sizeOfRawDataInBytes, error: &error)
if error != nil {
NSLog("%@ %@", error!.userInfo!, error!)
if completion != nil {
NSOperationQueue.mainQueue().addOperationWithBlock { () -> Void in
completion!(error: error)
}
}
} else {
NSFileManager.defaultManager().createFileAtPath(path!, contents: nil, attributes: nil)
rawData.writeToFile(path, atomically: true)
if completion != nil {
NSOperationQueue.mainQueue().addOperationWithBlock { () -> Void in
completion!(error: nil)
}
}
}
尝试writeToFile时的一些值:
alAsset = (ALAsset!) 0x17d6f770
completion = (((error: NSError!) -> ())?)
path = (String!) "/var/mobile/Applications/3C2E3C85-8F24-4CF1-958D-5D79A3200BE0/Documents/BEC3072C-45E9-4BC9-85C9-54FB6D9A1562.JPG"
rawData = (NSConcreteMutableData *) 0 bytes
bufferPtr = (UnsafeMutablePointer<()>) 0x03b9f000
bufferPtr8 = (UnsafeMutablePointer<UInt8>) 0x03b9f000
error = (NSError?) nil
assetRep = (ALAssetRepresentation!) 0x1468e6b0
sizeOfRawDataInBytes = (Int) 1118987
尝试从assetRep获取getBytes后,我的NSData为空。还有另一种方法可以将UnsafeMutablePointer<Void>
转换为UnsafeMutablePointer<UInt8>
吗?我想从我的NSData中获取资产中的字节,以便我可以轻松地编写ToFile。
[编辑]
而不是:
rawData.writeToFile(path, atomically: true)
我刚试过这个并且有效:
let newData: NSData = NSData(bytesNoCopy: bufferPtr8, length: sizeOfRawDataInBytes, freeWhenDone: false)
newData.writeToFile(path, atomically: true)
似乎bufferPtr和bufferPtr8毕竟不一样,但它们的值在运行时是相同的。
是否可以将NSData的mutableBytes直接转换并传递给getBytes?
答案 0 :(得分:1)
我想通了,你需要使用:
var rawData: NSMutableData = NSMutableData(length: sizeOfRawDataInBytes)
而不是NSMutableData(capacity: sizeOfRawDataInBytes)
。
rawData.length
仍设置为0
,因为assetRep.getBytes
仅在给定指针处设置数据,但它不会告诉rawData
数据实际存在。
我认为你实际上在这里冒着内存损坏的风险,因为如果你使用capacity
初始化,它并不总是立即分配内存。 Check out the NSMutableData docs