我正在将一个大文件读入NSMutableData对象。
var lBuffer : NSMutableData = try NSMutableData(contentsOfFile: pFilePath)
我想一次使用NSMutableData对象的一部分。因此,我尝试使用.subdata(with:NSRange),但出现错误。
var lBufferChunk : NSMutableData = lBuffer.subdata(with: NSRange(location: 0, length: lSizeOfChunk)) as! NSMutableData
我得到的错误是:
无法将类型为“ NSSubrangeData”(0x7fffa6ea3ef8)的值强制转换为“ NSMutableData”(0x7fffa6a403f8)
根据文档,.subdata(with:NSRange)应该返回一个Data对象。
如何获取数据对象以将其强制转换回NSMutableData?还是有更好的方法从大型NSMutableData中获取片段/片段?
答案 0 :(得分:1)
如果确实愿意,可以将调用lBuffer.subdata
的结果强制转换为NSData,然后调用mutableCopy()
并将结果强制转换为NSMutableData。但是不要!首先甚至不要使用NSData或NSMutableData。这是斯威夫特。使用数据。
var lBuffer = Data(contentsOf: myFileURL)
现在只需拨打subdata(in:)
var lBufferChunk = lBuffer.subdata(in: myRange)
或下标
var lBufferChunk = lBuffer[myRange]
var
使其可变。
答案 1 :(得分:0)
因此,我走了另一条路来解决我的问题。如您所见,我想将文件读入NSMutableData对象,但想一次复制它的较小部分(对于大文件)。我决定不使用一个数据对象的范围并将其传递给另一个对象,而是决定使用输入流。
var lInputStream : InputStream = InputStream(fileAtPath: pFilePath)!
var lBuffer : UnsafeMutablePointer<UInt8> = UnsafeMutablePointer<UInt8>.allocate(capacity: lBufferSize)
lInputStream.open()
while lInputStream.hasBytesAvailable {
let read = lInputStream.read(lBuffer, maxLength: lBufferSize)
var dataChunk = NSMutableData(length: 0)
dataChunk?.append(lBuffer, length: read)
...
}
lInputStream.close()
对于问题最初提出的方式,马特的回答是正确的,我已将其标记为是。只想分享我最终做的事情。