2015-05-19 100 views
2

我試圖從給定的資源庫URL獲取UIImage對象。我想爲我做這個功能。 指定的網址是:assets-library://asset/asset.JPG?id=46811D66-DBB4-46D9-BBA2-0CF0D58FC7AD&ext=JPG我用下面的方法試了一下:嘗試從資源庫Url獲取UIImage

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的Swift錯誤在這裏可能會更清晰,但我敢打賭,因爲您試圖從resultBlock返回UIImage,編譯器已將您提供的resultBlock的類型推斷爲(ALAsset!) -> UIImage,這與預期類型(ALAsset!) -> Void不匹配。

由於assertForURL:resultBlock:failureBlock:的工作方式(兩個完成返回類型Void),您將永遠無法從任一完成塊返回任何內容。您需要將用於顯示或以其他方式處理圖像的代碼作爲resultBlock的一部分傳遞到assertForURL:resultBlock:failureBlock:

因此,您將無法從功能getUIImagefromAsseturl:返回圖像,因此您需要刪除返回類型UIImage

如果您計劃顯示圖像,最好從主線程內更新UI。這很容易:

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'中測試nil,我做了一個標準的Swift'如果let'綁定。它似乎已經安撫Xcode。 – justinpawela

+0

另外,當定義'resultBlock'(以及'failureBlock')時,我使用'{asset in ...}'而不是'{(asset:ALAsset!)in ...}'。這可以讓Xcode在處理塊時使用推斷鍵入,儘管它確實不應該有所作爲。 Xcode + Swift有時候仍然很敏感。 – justinpawela