Swift:将ALAsset复制到app的文档目录中

时间:2014-10-03 10:11:06

标签: swift

我正在尝试将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?

1 个答案:

答案 0 :(得分:1)

我想通了,你需要使用:

var rawData: NSMutableData = NSMutableData(length: sizeOfRawDataInBytes)

而不是NSMutableData(capacity: sizeOfRawDataInBytes)

rawData.length仍设置为0,因为assetRep.getBytes仅在给定指针处设置数据,但它不会告诉rawData数据实际存在。

我认为你实际上在这里冒着内存损坏的风险,因为如果你使用capacity初始化,它并不总是立即分配内存。 Check out the NSMutableData docs