Скопируйте часть NSMutableData в новый объект NSMutableData - PullRequest
0 голосов
/ 21 ноября 2018

Я читаю в большом файле в объект NSMutableData.

var lBuffer : NSMutableData = try NSMutableData(contentsOfFile: pFilePath)

Я хотел бы получить часть объекта NSMutableData для работы одновременно.Поэтому я пытаюсь использовать .subdata (с: NSRange), но получаю ошибку.

var lBufferChunk : NSMutableData = lBuffer.subdata(with: NSRange(location: 0, length: lSizeOfChunk)) as! NSMutableData

Полученная ошибка:
Невозможно привести значение типа 'NSSubrangeData' (0x7fffa6ea3ef8)to 'NSMutableData' (0x7fffa6a403f8)

Согласно документации, .subdata (with: NSRange) должен возвращать объект Data.

Как я могу получить его в объект данных, чтобы привести его обратно к NSMutableData?Или есть лучший способ получить часть / фрагмент из большого NSMutableData?

Ответы [ 2 ]

0 голосов
/ 28 ноября 2018

Итак, я пошел другим путем, чтобы решить мою проблему.Как вы можете видеть, я хотел прочитать в файле объект NSMutableData, но хотел копировать меньшие его части за раз (в случае больших файлов).Вместо того, чтобы читать диапазон одного объекта Data и передавать его другому, я решил вместо этого использовать поток ввода.

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()

Ответ Мэтта верен для того, как вопрос был задан изначально, и я пометил его так.Просто хотел поделиться тем, что я в итоге делал.

0 голосов
/ 21 ноября 2018

Если вы действительно хотите, вы можете привести результат вызова 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 делает его изменяемым.

...