2015-05-19 3 views
2

Я пытаюсь получить объект UIImage из данного URL-адреса Asset-Library. Я хочу, чтобы функция делала это для меня. Данный Url является: assets-library://asset/asset.JPG?id=46811D66-DBB4-46D9-BBA2-0CF0D58FC7AD&ext=JPG Я попробовал его со следующим подходом:Попытайтесь получить UIImage из библиотеки инструментов Url

var url = NSURL() // url = "assets-library://asset/asset.JPG?id=46811D66-DBB4-46D9-BBA2-0CF0D58FC7AD&ext=JPG" got it from another scene 
var asset = ALAssetsLibrary() 
var tempImage = UIImage() 
tempImage = getUIImagefromAsseturl(url) 



func getUIImagefromAsseturl (url: NSURL) -> UIImage { 

    asset.assetForURL(url, resultBlock: { 
     (asset: ALAsset!) in 
     if asset != nil { 
      var assetRep: ALAssetRepresentation = asset.defaultRepresentation() 
      var iref = assetRep.fullResolutionImage().takeUnretainedValue() 
      var image = UIImage(CGImage: iref) 
      return image 

     } 
     }, failureBlock: { 
      (error: NSError!) in 

      NSLog("Error!", nil) 
     } 
    ) 


} 

Но я всегда получаю ошибку о том, что: не может ссылаться на «assetForURL» со списком аргументов типа «(NSURL, resultBlock: (ALAsset!) -> _, failureBlock: (NSError!) -> _) '

Может кто-нибудь, пожалуйста, скажите мне, что я здесь делаю неправильно?

ответ

4

Похоже, вы пытаетесь вернуть свое изображение изнутри resultBlock, но этот блок имеет тип (ALAsset!) -> Void, поэтому вы не можете вернуть изображение изнутри блока. В то время как ошибка Xcode's Swift может быть более ясной здесь, я уверен, что, поскольку вы пытаетесь вернуть UIImage из своего resultBlock, компилятор определил тип вашего предоставленного resultBlock как (ALAsset!) -> UIImage, который не соответствует ожидаемому типу (ALAsset!) -> Void.

В связи с тем, что работает assertForURL:resultBlock:failureBlock: (оба варианта возврата возвращают тип Void), вы никогда не сможете вернуть что-либо из любого из блоков завершения. Вам необходимо будет передать код для отображения или иным образом обрабатывать изображение в assertForURL:resultBlock:failureBlock: как часть resultBlock.

Из-за этого вы не сможете вернуть изображение из своей функции getUIImagefromAsseturl:, поэтому вам нужно удалить возвращаемый тип UIImage.

Если вы планируете отображать изображение, лучше всего обновить пользовательский интерфейс из основного потока. Это довольно просто:

func getUIImagefromAsseturl (url: NSURL) { 

    asset.assetForURL(url, resultBlock: { asset in 
     if let ast = asset { 
      let assetRep = ast.defaultRepresentation() 
      let iref = assetRep.fullResolutionImage().takeUnretainedValue() 
      let image = UIImage(CGImage: iref) 
      dispatch_async(dispatch_get_main_queue(), { 
       // ...Update UI with image here 
      }) 
     } 
    }, failureBlock: { error in 
     println("Error: \(error)") 
    }) 
} 
+0

thanx для вашего ответа, но с изменением кода на ваш код, по-прежнему вызывает ту же ошибку. – dennis605

+0

Я снова обновил код. Попробуйте. Это немного дальше от вас, но функционально так же, как и мое последнее редактирование. Это проверено для работы в Xcode 6.3.1. Вместо того, чтобы тестировать нуль в 'resultBlock', как и вы, я выполнил стандартную привязку Swift' if let'. Кажется, это успокоило Xcode. – justinpawela

+0

Также я использовал '{asset in ...}' вместо '{(asset: ALAsset!) In ...}' при определении 'resultBlock' (а также' failureBlock'). Это позволяет Xcode просто использовать выводимую типизацию при обработке блоков, хотя это действительно не должно иметь значения. Иногда Xcode + Swift может быть очень трогательным. – justinpawela

Смежные вопросы