2015-10-07 4 views
1

Я попытался преобразовать ALAsset в NSData в следующем коде:Как преобразовать ALAsset в NSData в Swift?

 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

+0

'getBytes: fromOffset: length: error:' возвращает количество записанных байтов. Итак, я думаю, что вы имели в виду 'let data = NSData (bytesNoCopy: & buffer, length: buffered, freeWhenDone: true)' – Larme

+1

У вас была возможность проверить ответ? –

+0

Извините за задержку. – malhobayyeb

ответ

4

Есть две проблем в вашем коде:

  • rep.getBytes() записывает байты в существующем буфер, который должен быть был выделен с искомым размер. Ваш буфер, созданный с помощью var buffer: UInt8 = UInt8(), имеет нулевое значение.
  • (Как @Lame уже сказано в комментарии :) Возвращаемое значение rep.getBytes() - это количество байтов, записанных в буфер, а не указатель на данные.

Проще всего было бы создать 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 нежелателен из прошивкой 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 
     // ... 
    } 
} 
Смежные вопросы